{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|          | 0/500 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "OBJ 文件已生成：../../data/Refpa/data0.obj\n"
     ]
    },
    {
     "data": {
      "application/vnd.plotly.v1+json": {
       "config": {
        "plotlyServerURL": "https://plot.ly"
       },
       "data": [
        {
         "color": "lightblue",
         "i": [
          6,
          6,
          8,
          1,
          2,
          4,
          1
         ],
         "j": [
          8,
          7,
          0,
          2,
          4,
          2,
          5
         ],
         "k": [
          5,
          8,
          5,
          5,
          5,
          3,
          0
         ],
         "opacity": 0.5,
         "type": "mesh3d",
         "x": [
          -24.7,
          24.7,
          31.991112361456214,
          34.35619656845911,
          15.495082291489883,
          6.835128409760205,
          -24.672616606924144,
          -31.391481024759305,
          -30.468972482621545
         ],
         "y": [
          20.5,
          20.5,
          30.337566064089756,
          53.54075801304125,
          64.5865486381895,
          65.00533860955497,
          65.05839360785482,
          57.227194198743746,
          38.545809654553146
         ],
         "z": [
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0
         ]
        }
       ],
       "layout": {
        "scene": {
         "xaxis": {
          "visible": false
         },
         "yaxis": {
          "visible": false
         },
         "zaxis": {
          "visible": false
         }
        },
        "template": {
         "data": {
          "bar": [
           {
            "error_x": {
             "color": "#2a3f5f"
            },
            "error_y": {
             "color": "#2a3f5f"
            },
            "marker": {
             "line": {
              "color": "#E5ECF6",
              "width": 0.5
             },
             "pattern": {
              "fillmode": "overlay",
              "size": 10,
              "solidity": 0.2
             }
            },
            "type": "bar"
           }
          ],
          "barpolar": [
           {
            "marker": {
             "line": {
              "color": "#E5ECF6",
              "width": 0.5
             },
             "pattern": {
              "fillmode": "overlay",
              "size": 10,
              "solidity": 0.2
             }
            },
            "type": "barpolar"
           }
          ],
          "carpet": [
           {
            "aaxis": {
             "endlinecolor": "#2a3f5f",
             "gridcolor": "white",
             "linecolor": "white",
             "minorgridcolor": "white",
             "startlinecolor": "#2a3f5f"
            },
            "baxis": {
             "endlinecolor": "#2a3f5f",
             "gridcolor": "white",
             "linecolor": "white",
             "minorgridcolor": "white",
             "startlinecolor": "#2a3f5f"
            },
            "type": "carpet"
           }
          ],
          "choropleth": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "type": "choropleth"
           }
          ],
          "contour": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "contour"
           }
          ],
          "contourcarpet": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "type": "contourcarpet"
           }
          ],
          "heatmap": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "heatmap"
           }
          ],
          "heatmapgl": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "heatmapgl"
           }
          ],
          "histogram": [
           {
            "marker": {
             "pattern": {
              "fillmode": "overlay",
              "size": 10,
              "solidity": 0.2
             }
            },
            "type": "histogram"
           }
          ],
          "histogram2d": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "histogram2d"
           }
          ],
          "histogram2dcontour": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "histogram2dcontour"
           }
          ],
          "mesh3d": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "type": "mesh3d"
           }
          ],
          "parcoords": [
           {
            "line": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "parcoords"
           }
          ],
          "pie": [
           {
            "automargin": true,
            "type": "pie"
           }
          ],
          "scatter": [
           {
            "fillpattern": {
             "fillmode": "overlay",
             "size": 10,
             "solidity": 0.2
            },
            "type": "scatter"
           }
          ],
          "scatter3d": [
           {
            "line": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scatter3d"
           }
          ],
          "scattercarpet": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scattercarpet"
           }
          ],
          "scattergeo": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scattergeo"
           }
          ],
          "scattergl": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scattergl"
           }
          ],
          "scattermapbox": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scattermapbox"
           }
          ],
          "scatterpolar": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scatterpolar"
           }
          ],
          "scatterpolargl": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scatterpolargl"
           }
          ],
          "scatterternary": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scatterternary"
           }
          ],
          "surface": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "surface"
           }
          ],
          "table": [
           {
            "cells": {
             "fill": {
              "color": "#EBF0F8"
             },
             "line": {
              "color": "white"
             }
            },
            "header": {
             "fill": {
              "color": "#C8D4E3"
             },
             "line": {
              "color": "white"
             }
            },
            "type": "table"
           }
          ]
         },
         "layout": {
          "annotationdefaults": {
           "arrowcolor": "#2a3f5f",
           "arrowhead": 0,
           "arrowwidth": 1
          },
          "autotypenumbers": "strict",
          "coloraxis": {
           "colorbar": {
            "outlinewidth": 0,
            "ticks": ""
           }
          },
          "colorscale": {
           "diverging": [
            [
             0,
             "#8e0152"
            ],
            [
             0.1,
             "#c51b7d"
            ],
            [
             0.2,
             "#de77ae"
            ],
            [
             0.3,
             "#f1b6da"
            ],
            [
             0.4,
             "#fde0ef"
            ],
            [
             0.5,
             "#f7f7f7"
            ],
            [
             0.6,
             "#e6f5d0"
            ],
            [
             0.7,
             "#b8e186"
            ],
            [
             0.8,
             "#7fbc41"
            ],
            [
             0.9,
             "#4d9221"
            ],
            [
             1,
             "#276419"
            ]
           ],
           "sequential": [
            [
             0,
             "#0d0887"
            ],
            [
             0.1111111111111111,
             "#46039f"
            ],
            [
             0.2222222222222222,
             "#7201a8"
            ],
            [
             0.3333333333333333,
             "#9c179e"
            ],
            [
             0.4444444444444444,
             "#bd3786"
            ],
            [
             0.5555555555555556,
             "#d8576b"
            ],
            [
             0.6666666666666666,
             "#ed7953"
            ],
            [
             0.7777777777777778,
             "#fb9f3a"
            ],
            [
             0.8888888888888888,
             "#fdca26"
            ],
            [
             1,
             "#f0f921"
            ]
           ],
           "sequentialminus": [
            [
             0,
             "#0d0887"
            ],
            [
             0.1111111111111111,
             "#46039f"
            ],
            [
             0.2222222222222222,
             "#7201a8"
            ],
            [
             0.3333333333333333,
             "#9c179e"
            ],
            [
             0.4444444444444444,
             "#bd3786"
            ],
            [
             0.5555555555555556,
             "#d8576b"
            ],
            [
             0.6666666666666666,
             "#ed7953"
            ],
            [
             0.7777777777777778,
             "#fb9f3a"
            ],
            [
             0.8888888888888888,
             "#fdca26"
            ],
            [
             1,
             "#f0f921"
            ]
           ]
          },
          "colorway": [
           "#636efa",
           "#EF553B",
           "#00cc96",
           "#ab63fa",
           "#FFA15A",
           "#19d3f3",
           "#FF6692",
           "#B6E880",
           "#FF97FF",
           "#FECB52"
          ],
          "font": {
           "color": "#2a3f5f"
          },
          "geo": {
           "bgcolor": "white",
           "lakecolor": "white",
           "landcolor": "#E5ECF6",
           "showlakes": true,
           "showland": true,
           "subunitcolor": "white"
          },
          "hoverlabel": {
           "align": "left"
          },
          "hovermode": "closest",
          "mapbox": {
           "style": "light"
          },
          "paper_bgcolor": "white",
          "plot_bgcolor": "#E5ECF6",
          "polar": {
           "angularaxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           },
           "bgcolor": "#E5ECF6",
           "radialaxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           }
          },
          "scene": {
           "xaxis": {
            "backgroundcolor": "#E5ECF6",
            "gridcolor": "white",
            "gridwidth": 2,
            "linecolor": "white",
            "showbackground": true,
            "ticks": "",
            "zerolinecolor": "white"
           },
           "yaxis": {
            "backgroundcolor": "#E5ECF6",
            "gridcolor": "white",
            "gridwidth": 2,
            "linecolor": "white",
            "showbackground": true,
            "ticks": "",
            "zerolinecolor": "white"
           },
           "zaxis": {
            "backgroundcolor": "#E5ECF6",
            "gridcolor": "white",
            "gridwidth": 2,
            "linecolor": "white",
            "showbackground": true,
            "ticks": "",
            "zerolinecolor": "white"
           }
          },
          "shapedefaults": {
           "line": {
            "color": "#2a3f5f"
           }
          },
          "ternary": {
           "aaxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           },
           "baxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           },
           "bgcolor": "#E5ECF6",
           "caxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           }
          },
          "title": {
           "x": 0.05
          },
          "xaxis": {
           "automargin": true,
           "gridcolor": "white",
           "linecolor": "white",
           "ticks": "",
           "title": {
            "standoff": 15
           },
           "zerolinecolor": "white",
           "zerolinewidth": 2
          },
          "yaxis": {
           "automargin": true,
           "gridcolor": "white",
           "linecolor": "white",
           "ticks": "",
           "title": {
            "standoff": 15
           },
           "zerolinecolor": "white",
           "zerolinewidth": 2
          }
         }
        },
        "title": {
         "text": "OBJ File Visualization"
        }
       }
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|          | 0/500 [00:00<?, ?it/s]\n"
     ]
    }
   ],
   "source": [
    "# 完整跑仿真程序\n",
    "\n",
    "import numpy as np\n",
    "import triangle\n",
    "import numpy as np\n",
    "from shapely.geometry import Polygon\n",
    "import matplotlib.pyplot as plt\n",
    "import os\n",
    "import numpy as np\n",
    "import sys\n",
    "sys.path.append(r\"C:\\Reaserch\\CSTStudioSuite2021\\AMD64\\python_cst_libraries\")\n",
    "import cst.interface\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from scipy.spatial import ConvexHull\n",
    "import trimesh\n",
    "import plotly.graph_objects as go\n",
    "from tqdm import tqdm\n",
    "line_break = '\\n'#换行符，后面用于VBA代买的拼接用\n",
    "\n",
    "\n",
    "# 生成一个随机的二维多边形\n",
    "def generate_random_2d_polygon(num_vertices=6):\n",
    "    #points = np.random.rand(num_vertices, 2)\n",
    "    points = np.random.uniform(-19, 19,size=(num_vertices, 2))\n",
    "    center = np.mean(points, axis=0)\n",
    "    angles = np.arctan2(points[:, 1] - center[1], points[:, 0] - center[0])\n",
    "    points = points[np.argsort(angles)]\n",
    "    return points\n",
    "\n",
    "def generate_polygon_with_fixed_edges2(fixed_edges, num_random_vertices=4):\n",
    "    # 提取固定边的顶点\n",
    "    fixed_points = np.vstack(fixed_edges)\n",
    "    \n",
    "    # 在 -19 到 19 之间生成间隔为 0.1 的点\n",
    "    x_values = np.arange(-24.7, 24.7, 5)\n",
    "    y_values = np.arange(-20.5, 20.5, 5)\n",
    "    \n",
    "    # 随机选择 num_random_vertices 个点\n",
    "    random_points = []\n",
    "    while len(random_points) < num_random_vertices:\n",
    "        # 随机选择 x 和 y 坐标\n",
    "        x = np.random.choice(x_values)\n",
    "        y = np.random.choice(y_values)\n",
    "        point = np.array([x, y])\n",
    "        random_points.append(point)\n",
    "    \n",
    "    random_points = np.array(random_points)\n",
    "    \n",
    "    # 将固定的点和随机点合并在一起\n",
    "    all_points = np.vstack([fixed_points, random_points])\n",
    "    \n",
    "    # 计算所有点的中心点\n",
    "    center = np.mean(all_points, axis=0)\n",
    "    \n",
    "    # 按照与中心点的角度对所有点进行排序（确保按逆时针方向排列）\n",
    "    angles = np.arctan2(all_points[:, 1] - center[1], all_points[:, 0] - center[0])\n",
    "    sorted_points = all_points[np.argsort(angles)]\n",
    "    \n",
    "    # 使用 shapely 生成 Polygon\n",
    "    polygon = Polygon(sorted_points)\n",
    "    \n",
    "    return polygon, sorted_points\n",
    "\n",
    "\n",
    "# 生成包含已知边的随机二维多边形（y坐标要大于0.4或者小于0.3）\n",
    "def generate_polygon_with_fixed_edges(fixed_edges, num_random_vertices=4):\n",
    "    # 提取固定边的顶点\n",
    "    fixed_points = np.vstack(fixed_edges)\n",
    "    \n",
    "    # 随机生成其余的点，满足 y > 0.4 或 y < 0.3\n",
    "    random_points = []\n",
    "    while len(random_points) < num_random_vertices:\n",
    "        #point = np.random.rand(2)  # 生成一个随机点\n",
    "        point = np.random.uniform(-19, 19,size=2)\n",
    "        #if point[1] > 0.4 or point[1] < 0.3:  # 仅保留 y 坐标符合条件的点\n",
    "        random_points.append(point)\n",
    "    random_points = np.array(random_points)\n",
    "    \n",
    "    # 将固定的点和随机点合并在一起\n",
    "    all_points = np.vstack([fixed_points, random_points])\n",
    "    \n",
    "    # 计算所有点的中心点\n",
    "    center = np.mean(all_points, axis=0)\n",
    "    \n",
    "    # 按照与中心点的角度对所有点进行排序（确保按逆时针方向排列）\n",
    "    angles = np.arctan2(all_points[:, 1] - center[1], all_points[:, 0] - center[0])\n",
    "    sorted_points = all_points[np.argsort(angles)]\n",
    "    \n",
    "    # 使用 shapely 生成 Polygon\n",
    "    polygon = Polygon(sorted_points)\n",
    "    \n",
    "    return polygon, sorted_points\n",
    "# 对多边形进行三角剖分\n",
    "def constrained_triangulation(polygon_points):\n",
    "    vertices = np.array(polygon_points)\n",
    "    # 定义约束边，保持多边形的边界不被破坏\n",
    "    segments = np.array([[i, (i + 1) % len(vertices)] for i in range(len(vertices))])\n",
    "    \n",
    "    # 使用 triangle 库进行带约束的三角剖分\n",
    "    A = dict(vertices=vertices, segments=segments)\n",
    "    triangulation = triangle.triangulate(A, 'p')\n",
    "    \n",
    "    return triangulation\n",
    "\n",
    "# 将三角剖分结果保存为OBJ文件\n",
    "def export_to_obj(triangulation, filename=\"polygon_triangulated.obj\"):\n",
    "    vertices = triangulation['vertices']\n",
    "    triangles = triangulation['triangles']\n",
    "    \n",
    "    with open(filename, 'w') as f:\n",
    "        # 写入顶点信息\n",
    "        for v in vertices:\n",
    "            f.write(f\"v {v[0]} {v[1]} 0.0\\n\")  # z 设为 0 表示在二维平面上\n",
    "        \n",
    "        # 写入面（每个面由3个顶点构成）\n",
    "        for tri in triangles:\n",
    "            # OBJ 索引从1开始，因此要加1\n",
    "            f.write(f\"f {tri[0] + 1} {tri[1] + 1} {tri[2] + 1}\\n\")\n",
    "\n",
    "\n",
    "# 加载OBJ文件并转换为Plotly格式\n",
    "def plot_obj_in_jupyter(obj_filename):\n",
    "    # 使用trimesh加载OBJ文件\n",
    "    mesh = trimesh.load(obj_filename)\n",
    "    \n",
    "    # 获取顶点和面数据\n",
    "    vertices = mesh.vertices\n",
    "    faces = mesh.faces\n",
    "    \n",
    "    # 创建Plotly图形对象\n",
    "    mesh_plot = go.Mesh3d(\n",
    "        x=vertices[:, 0],\n",
    "        y=vertices[:, 1],\n",
    "        z=vertices[:, 2],\n",
    "        i=faces[:, 0],\n",
    "        j=faces[:, 1],\n",
    "        k=faces[:, 2],\n",
    "        opacity=0.5,\n",
    "        color='lightblue'\n",
    "    )\n",
    "    \n",
    "    # 设置布局\n",
    "    layout = go.Layout(\n",
    "        scene=dict(\n",
    "            xaxis=dict(visible=False),\n",
    "            yaxis=dict(visible=False),\n",
    "            zaxis=dict(visible=False)\n",
    "        ),\n",
    "        title=\"OBJ File Visualization\"\n",
    "    )\n",
    "    \n",
    "    # 创建并展示图像\n",
    "    fig = go.Figure(data=[mesh_plot], layout=layout)\n",
    "    fig.show()\n",
    "\n",
    "def cst_init(fullname,modeler,mws):\n",
    "    # path = os.getcwd()#获取当前py文件所在文件夹\n",
    "    # filename = 'Patch_Antenna.cst'\n",
    "    # fullname = os.path.join(path,filename)\n",
    "    print(fullname)\n",
    "\n",
    "    # project = cst.interface.DesignEnvironment()\n",
    "    # project.set_quiet_mode(False)\n",
    "    # mws = project.new_mws()\n",
    "    mws.save(fullname)\n",
    "    # modeler = mws.modeler\n",
    "    #贴片天线建模基本参数\n",
    "    a = 38.6 #贴片长\n",
    "    b = 38 #贴片宽\n",
    "    w = 1.46 #馈线宽，100欧姆传输线\n",
    "    l = 40 #馈线长\n",
    "    lx = 100 #基板长\n",
    "    ly = 100 #基板宽\n",
    "    ts = 2 #基板厚\n",
    "    tm = 0.035 #金属层厚\n",
    "    Frq = [2,10] #工作频率，单位：GHz\n",
    "\n",
    "    #在CST中加入结构参数，方便后续手动在CST文件中进行操作\n",
    "    modeler.add_to_history('StoreParameter','MakeSureParameterExists(\"a\", \"%f\")' % a)\n",
    "    modeler.add_to_history('StoreParameter','MakeSureParameterExists(\"b\", \"%f\")' % b)\n",
    "    modeler.add_to_history('StoreParameter','MakeSureParameterExists(\"w\", \"%f\")' % w)\n",
    "    modeler.add_to_history('StoreParameter','MakeSureParameterExists(\"l\", \"%f\")' % l)\n",
    "    modeler.add_to_history('StoreParameter','MakeSureParameterExists(\"lx\", \"%f\")' % lx)\n",
    "    modeler.add_to_history('StoreParameter','MakeSureParameterExists(\"ly\", \"%f\")' % ly)\n",
    "    modeler.add_to_history('StoreParameter','MakeSureParameterExists(\"ts\", \"%f\")' % ts)\n",
    "    modeler.add_to_history('StoreParameter','MakeSureParameterExists(\"tm\", \"%f\")' % tm)\n",
    "    #建模基本参数设置结束\n",
    "    line_break = '\\n'#换行符，后面用于VBA代买的拼接用\n",
    "    #全局单位初始化\n",
    "    sCommand = ['With Units',\n",
    "                '.Geometry \"mm\"',\n",
    "                '.Frequency \"ghz\"',\n",
    "                '.Time \"ns\"',\n",
    "                'End With']\n",
    "    sCommand = line_break.join(sCommand)\n",
    "    modeler.add_to_history('define units', sCommand)\n",
    "    #全局单位初始化结束\n",
    "\n",
    "    #工作频率设置\n",
    "    sCommand = 'Solver.FrequencyRange \"%f\",\"%f\"'  % (Frq[0],Frq[1])\n",
    "    modeler.add_to_history('define frequency range', sCommand)\n",
    "    #工作频率设置结束\n",
    "\n",
    "    #背景材料设置\n",
    "    sCommand = ['With Background',\n",
    "                '.ResetBackground',\n",
    "                '.Type \"Normal\"',\n",
    "                'End With']\n",
    "    sCommand = line_break.join(sCommand)\n",
    "    modeler.add_to_history('define background', sCommand)\n",
    "    #背景材料设置结束\n",
    "\n",
    "    #边界条件设置。\n",
    "    sCommand = ['With Boundary',\n",
    "                '.Xmin \"expanded open\"',\n",
    "                '.Xmax \"expanded open\"',\n",
    "                '.Ymin \"expanded open\"',\n",
    "                '.Ymax \"expanded open\"',\n",
    "                '.Zmin \"expanded open\"',\n",
    "                '.Zmax \"expanded open\"',\n",
    "                '.Xsymmetry \"none\"',\n",
    "                '.Ysymmetry \"none\"',\n",
    "                '.Zsymmetry \"none\"',\n",
    "                'End With']\n",
    "    sCommand = line_break.join(sCommand)\n",
    "    modeler.add_to_history('define boundary', sCommand)\n",
    "    #边界条件设置结束\n",
    "\n",
    "    #新建所需介质材料\n",
    "    er1 = 2.65\n",
    "    sCommand = ['With Material',\n",
    "                '.Reset',\n",
    "                '.Name \"material1\"',\n",
    "                '.FrqType \"all\"',\n",
    "                '.Type \"Normal\"',\n",
    "                '.Epsilon %f' %er1,\n",
    "                '.Create',\n",
    "                'End With']\n",
    "    sCommand = line_break.join(sCommand)\n",
    "    modeler.add_to_history('define material: material265', sCommand)\n",
    "    #新建所需介质材料结束\n",
    "\n",
    "    #使Bounding Box显示\n",
    "    sCommand = 'Plot.DrawBox \"True\"'\n",
    "    modeler.add_to_history('switch bounding box', sCommand)\n",
    "    #使Bounding Box显示结束\n",
    "\n",
    "    sCommand = 'Plot.ZoomToStructure'\n",
    "    modeler.add_to_history('ZoomToStructure', sCommand)#缩放到适合大小，就和在CST里面按空格是一个效果\n",
    "\n",
    "    Str_Name='line1'\n",
    "    Str_Component='Feed'\n",
    "    Str_Material='PEC'\n",
    "    sCommand = ['With Brick',\n",
    "                '.Reset',\n",
    "                '.Name \"%s\"' % Str_Name,\n",
    "                '.Component \"%s\"' % Str_Component,\n",
    "                '.Material \"%s\"' % Str_Material,\n",
    "                '.Xrange \"-lx/2\",\"-a/2\"',\n",
    "                '.Yrange \"-w/2\",\"w/2\"',\n",
    "                '.Zrange \"0\",\"tm\"',\n",
    "                '.Create',\n",
    "                'End With']\n",
    "    sCommand = line_break.join(sCommand)\n",
    "    modeler.add_to_history('define brick:%s:%s' % (Str_Component,Str_Name,), sCommand) \n",
    "\n",
    "    Str_Name='line2'\n",
    "    Str_Component='Feed'\n",
    "    Str_Material='PEC'\n",
    "    sCommand = ['With Brick',\n",
    "                '.Reset',\n",
    "                '.Name \"%s\"' % Str_Name,\n",
    "                '.Component \"%s\"' % Str_Component,\n",
    "                '.Material \"%s\"' % Str_Material,\n",
    "                '.Xrange \"a/2\",\"lx/2\"',\n",
    "                '.Yrange \"-w/2\",\"w/2\"',\n",
    "                '.Zrange \"0\",\"tm\"',\n",
    "                '.Create',\n",
    "                'End With']\n",
    "    sCommand = line_break.join(sCommand)\n",
    "    modeler.add_to_history('define brick:%s:%s' % (Str_Component,Str_Name,), sCommand)  \n",
    "    Str_Name='bottom'\n",
    "    Str_Component='Bottom'\n",
    "    Str_Material='PEC'\n",
    "    sCommand = ['With Brick',\n",
    "                '.Reset',\n",
    "                '.Name \"%s\"' % Str_Name,\n",
    "                '.Component \"%s\"' % Str_Component,\n",
    "                '.Material \"%s\"' % Str_Material,\n",
    "                '.Xrange \"-lx/2\",\"lx/2\"',\n",
    "                '.Yrange \"-ly/2\",\"ly/2\"',\n",
    "                '.Zrange \"-ts-tm\",\"-ts\"',\n",
    "                '.Create',\n",
    "                'End With']\n",
    "    sCommand = line_break.join(sCommand)\n",
    "    modeler.add_to_history('define brick:%s:%s' % (Str_Component,Str_Name,), sCommand) \n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "    Str_Name='sub'\n",
    "    Str_Component='Sub'\n",
    "    Str_Material='material1'\n",
    "    sCommand = ['With Brick',\n",
    "                '.Reset',\n",
    "                '.Name \"%s\"' % Str_Name,\n",
    "                '.Component \"%s\"' % Str_Component,\n",
    "                '.Material \"%s\"' % Str_Material,\n",
    "                '.Xrange \"-lx/2\",\"lx/2\"',\n",
    "                '.Yrange \"-ly/2\",\"ly/2\"',\n",
    "                '.Zrange \"-ts\",\"0\"',\n",
    "                '.Create',\n",
    "                'End With']\n",
    "    sCommand = line_break.join(sCommand)\n",
    "    modeler.add_to_history('define brick:%s:%s' % (Str_Component,Str_Name,), sCommand)\n",
    "    #建模结束\n",
    "\n",
    "    sCommand = 'Plot.ZoomToStructure'\n",
    "    modeler.add_to_history('ZoomToStructure', sCommand)#缩放到适合大小，就和在CST里面按空格是一个效果\n",
    "\n",
    "    #端口设置，采用的方法和在CST里面选中一个面然后设置端口是一样的操作，这里完全复现\n",
    "    #端口1\n",
    "    sCommand = 'Pick.PickFaceFromId \"Feed:line1\",4'\n",
    "    modeler.add_to_history('pick face', sCommand)\n",
    "    sCommand = ['With Port',\n",
    "                '.Reset',\n",
    "                '.PortNumber 1',\n",
    "                '.Label  \"\"',\n",
    "                '.NumberOfModes 1',\n",
    "                '.AdjustPolarization \"False\"',\n",
    "                '.PolarizationAngle 0.0',\n",
    "                '.ReferencePlaneDistance 0',\n",
    "                '.TextSize 50',\n",
    "                '.TextMaxLimit 0',\n",
    "                '.Coordinates \"Picks\"',\n",
    "                '.Orientation \"positive\"',\n",
    "                '.PortOnBound \"False\"',\n",
    "                '.ClipPickedPortToBound \"False\"',\n",
    "                '.Xrange \"-lx/2\",\"-lx/2\"',\n",
    "                '.Yrange \"-w/2\",\"w/2\"',\n",
    "                '.Zrange \"0\",\"tm\"',\n",
    "                '.XrangeAdd \"0.0\",\"0.0\"',\n",
    "                '.YrangeAdd \"3*ts\",\"3*ts\"',\n",
    "                '.ZrangeAdd \"ts\",\"3*ts\"',\n",
    "                '.SingleEnded \"False\"',\n",
    "                '.Create',\n",
    "                'End With']\n",
    "    sCommand = line_break.join(sCommand)     \n",
    "    modeler.add_to_history('define port1', sCommand)\n",
    "\n",
    "    #端口2\n",
    "    sCommand = 'Pick.PickFaceFromId \"Feed:line2\",6'\n",
    "    modeler.add_to_history('pick face', sCommand)\n",
    "    sCommand = ['With Port',\n",
    "                '.Reset',\n",
    "                '.PortNumber 2',\n",
    "                '.Label  \"\"',\n",
    "                '.NumberOfModes 1',\n",
    "                '.AdjustPolarization \"False\"',\n",
    "                '.PolarizationAngle 0.0',\n",
    "                '.ReferencePlaneDistance 0',\n",
    "                '.TextSize 50',\n",
    "                '.TextMaxLimit 0',\n",
    "                '.Coordinates \"Picks\"',\n",
    "                '.Orientation \"positive\"',\n",
    "                '.PortOnBound \"False\"',\n",
    "                '.ClipPickedPortToBound \"False\"',\n",
    "                '.Xrange \"lx/2\",\"lx/2\"',\n",
    "                '.Yrange \"-w/2\",\"w/2\"',\n",
    "                '.Zrange \"0\",\"tm\"',\n",
    "                '.XrangeAdd \"0.0\",\"0.0\"',\n",
    "                '.YrangeAdd \"3*ts\",\"3*ts\"',\n",
    "                '.ZrangeAdd \"ts\",\"3*ts\"',\n",
    "                '.SingleEnded \"False\"',\n",
    "                '.Create',\n",
    "                'End With']\n",
    "    sCommand = line_break.join(sCommand)     \n",
    "    modeler.add_to_history('define port2', sCommand)\n",
    "    #端口设置结束\n",
    "    # 原版的\n",
    "    # #设置远场方向图的Monitor\n",
    "    # sCommand = ['With Monitor',\n",
    "    #             '.Reset',\n",
    "    #             '.Domain \"Frequency\"',\n",
    "    #             '.FieldType \"Farfield\"',\n",
    "    #             #'.ExportFarfieldSource \"False\"',\n",
    "    #             '.ExportFarfieldSource \"True\"',\n",
    "    #             '.UseSubvolume \"False\"',\n",
    "    #             '.Coordinates \"Picks\"',\n",
    "    #             '.SetSubvolume \"50\", \"50\", \"-0.73\", \"0.73\", \"0\", \"0.035\"',\n",
    "    #             '.SetSubvolumeOffset \"10\", \"10\", \"10\", \"10\", \"10\", \"10\" ',\n",
    "    #             '.SetSubvolumeInflateWithOffset \"False\" ',\n",
    "    #             '.SetSubvolumeOffsetType \"FractionOfWavelength\" ',\n",
    "    #             '.EnableNearfieldCalculation \"True\" ',\n",
    "    #             '.CreateUsingLinearStep \"%f\", \"%f\", \"%f\"' % (Frq[0],Frq[1],0.05),\n",
    "    #             'End With']\n",
    "    # sCommand = line_break.join(sCommand) \n",
    "    # modeler.add_to_history('define farfield monitor (using linear step)',sCommand)\n",
    "    # #设置远场方向图的Monitor结束\n",
    "\n",
    "\n",
    "\n",
    "    # 程序里面的\n",
    "    # 设置远场方向图的Monitor\n",
    "    sCommand = ['With Monitor',\n",
    "                '.Reset',\n",
    "                '.Domain \"Frequency\"',\n",
    "                '.FieldType \"Farfield\"',\n",
    "                #'.ExportFarfieldSource \"False\"',\n",
    "                '.ExportFarfieldSource \"True\"',\n",
    "                '.UseSubvolume \"False\"',\n",
    "                '.Coordinates \"Structure\"',\n",
    "                '.SetSubvolume \"-50\", \"50\", \"-50\", \"50\", \"-2.035\", \"6.035\"',\n",
    "                '.SetSubvolumeOffset \"0.0\", \"0.0\", \"0.0\", \"0.0\", \"0.0\", \"0.0\"',\n",
    "                '.SetSubvolumeInflateWithOffset \"False\" ',\n",
    "                '.CreateUsingLinearStep \"%f\", \"%f\", \"%f\"' % (Frq[0],Frq[1],0.2),\n",
    "                'End With']\n",
    "    sCommand = line_break.join(sCommand) \n",
    "    modeler.add_to_history('define farfield monitor (using linear step)',sCommand)\n",
    "    #设置远场方向图的Monitor结束\n",
    "\n",
    "# With Monitor\n",
    "#           .Reset \n",
    "#           .Domain \"Frequency\"\n",
    "#           .FieldType \"Efield\"\n",
    "#           .Dimension \"Volume\" \n",
    "#           .UseSubvolume \"False\" \n",
    "#           .Coordinates \"Structure\" \n",
    "#           .SetSubvolume \"-50\", \"50\", \"-50\", \"50\", \"-2.035\", \"6.035\" \n",
    "#           .SetSubvolumeOffset \"0.0\", \"0.0\", \"0.0\", \"0.0\", \"0.0\", \"0.0\" \n",
    "#           .SetSubvolumeInflateWithOffset \"False\" \n",
    "#           .CreateUsingLinearStep \"2\", \"10\", \"0.9\"\n",
    "# End With\n",
    "\n",
    "\n",
    "# Mesh.SetCreator \"High Frequency\" \n",
    "\n",
    "# With Solver \n",
    "#      .Method \"Hexahedral\"\n",
    "#      .CalculationType \"TD-S\"\n",
    "#      .StimulationPort \"All\"\n",
    "#      .StimulationMode \"All\"\n",
    "#      .SteadyStateLimit \"-40\"\n",
    "#      .MeshAdaption \"False\"\n",
    "#      .AutoNormImpedance \"False\"\n",
    "#      .NormingImpedance \"50\"\n",
    "#      .CalculateModesOnly \"False\"\n",
    "#      .SParaSymmetry \"False\"\n",
    "#      .StoreTDResultsInCache  \"False\"\n",
    "#      .FullDeembedding \"False\"\n",
    "#      .SuperimposePLWExcitation \"False\"\n",
    "#      .UseSensitivityAnalysis \"False\"\n",
    "# End With\n",
    "\n",
    "    #求解\n",
    "    sCommand = ['Mesh.SetCreator \"High Frequency\" ',\n",
    "                'With Solver',\n",
    "                '.Method \"Hexahedral\"',\n",
    "                '.CalculationType \"TD-S\"',\n",
    "                '.StimulationPort \"All\"',\n",
    "                '.StimulationMode \"All\"',\n",
    "                '.SteadyStateLimit \"-40\"',\n",
    "                '.MeshAdaption \"False\"',\n",
    "                '.AutoNormImpedance \"False\"',\n",
    "                '.NormingImpedance \"50\"',\n",
    "                '.CalculateModesOnly \"False\"',\n",
    "                '.SParaSymmetry \"False\"',\n",
    "                #'.StoreTDResultsInCache  \"False\"',\n",
    "                '.StoreTDResultsInCache  \"True\"',\n",
    "                '.FullDeembedding \"False\"',\n",
    "                '.SuperimposePLWExcitation \"False\"',\n",
    "                '.UseSensitivityAnalysis \"False\"',         \n",
    "                'End With']\n",
    "    sCommand = line_break.join(sCommand) \n",
    "    modeler.add_to_history('define Mesh.SetCreator',sCommand)\n",
    "\n",
    "    # # 设置成极坐标\n",
    "    # sCommand =  ['With FarfieldPlot',\n",
    "    #     '.Plottype \"Polar\"',\n",
    "    #     '.Vary \"angle1\"',\n",
    "    #     '.Theta \"90\"',\n",
    "    #     '.Phi \"90\"' ,\n",
    "    #     '.Step \"1\"',\n",
    "    #     '.Step2 \"1\"',\n",
    "    #     '.SetLockSteps \"True\"',\n",
    "    #     '.SetPlotRangeOnly \"False\"',\n",
    "    #     '.SetThetaStart \"0\"',\n",
    "    #     '.SetThetaEnd \"180\"' ,\n",
    "    #     '.SetPhiStart \"0\"' ,\n",
    "    #     '.SetPhiEnd \"360\"' ,\n",
    "    #     '.SetTheta360 \"False\"' ,\n",
    "    #     '.SymmetricRange \"False\"' ,\n",
    "    #     '.SetTimeDomainFF \"False\"' ,\n",
    "    #     '.SetFrequency \"-1\"' ,\n",
    "    #     '.SetTime \"0\"' ,\n",
    "    #     '.SetColorByValue \"True\"' ,\n",
    "    #     '.DrawStepLines \"False\"' ,\n",
    "    #     '.DrawIsoLongitudeLatitudeLines \"False\"' ,\n",
    "    #     '.ShowStructure \"False\"' ,\n",
    "    #     '.ShowStructureProfile \"False\"' ,\n",
    "    #     '.SetStructureTransparent \"False\"' ,\n",
    "    #     '.SetFarfieldTransparent \"False\"' ,\n",
    "    #     '.AspectRatio \"Free\"' ,\n",
    "    #     '.ShowGridlines \"True\"' ,\n",
    "    #     '.SetSpecials \"enablepolarextralines\"' ,\n",
    "    #     '.SetPlotMode \"Directivity\"' ,\n",
    "    #     '.Distance \"1\"' ,\n",
    "    #     '.UseFarfieldApproximation \"True\"' ,\n",
    "    #     '.IncludeUnitCellSidewalls \"True\"' ,\n",
    "    #     '.SetScaleLinear \"False\"' ,\n",
    "    #     '.SetLogRange \"40\"' ,\n",
    "    #     '.SetLogNorm \"0\"' ,\n",
    "    #     '.DBUnit \"0\"' ,\n",
    "    #     '.SetMaxReferenceMode \"abs\"' ,\n",
    "    #     '.EnableFixPlotMaximum \"False\"' ,\n",
    "    #     '.SetFixPlotMaximumValue \"1\"' ,\n",
    "    #     '.SetInverseAxialRatio \"False\"' ,\n",
    "    #     '.SetAxesType \"user\"' ,\n",
    "    #     '.SetAntennaType \"unknown\"',\n",
    "    #     '.Phistart \"1.000000e+00\", \"0.000000e+00\", \"0.000000e+00\"' ,\n",
    "    #     '.Thetastart \"0.000000e+00\", \"0.000000e+00\", \"1.000000e+00\"' ,\n",
    "    #     '.PolarizationVector \"0.000000e+00\", \"1.000000e+00\", \"0.000000e+00\"' ,\n",
    "    #     '.SetCoordinateSystemType \"spherical\"' ,\n",
    "    #     '.SetAutomaticCoordinateSystem \"True\"' ,\n",
    "    #     '.SetPolarizationType \"Linear\"' ,\n",
    "    #     '.SlantAngle 0.000000e+00' ,\n",
    "    #     '.Origin \"bbox\"' ,\n",
    "    #     '.Userorigin \"0.000000e+00\", \"0.000000e+00\", \"0.000000e+00\"' ,\n",
    "    #     '.SetUserDecouplingPlane \"False\"' ,\n",
    "    #     '.UseDecouplingPlane \"False\"' ,\n",
    "    #     '.DecouplingPlaneAxis \"X\"' ,\n",
    "    #     '.DecouplingPlanePosition \"0.000000e+00\"' ,\n",
    "    #     '.LossyGround \"False\"' ,\n",
    "    #     '.GroundEpsilon \"1\"' ,\n",
    "    #     '.GroundKappa \"0\"' ,\n",
    "    #     '.EnablePhaseCenterCalculation \"False\"' ,\n",
    "    #     '.SetPhaseCenterAngularLimit \"3.000000e+01\"' ,\n",
    "    #     '.SetPhaseCenterComponent \"boresight\"' ,\n",
    "    #     '.SetPhaseCenterPlane \"both\"' ,\n",
    "    #     '.ShowPhaseCenter \"True\"' ,\n",
    "    #     '.ClearCuts' ,\n",
    "    #     '.StoreSettings',\n",
    "    #     'End With']\n",
    "\n",
    "    # sCommand = line_break.join(sCommand)\n",
    "    # modeler.add_to_history('FarfieldPlot Polar', sCommand)\n",
    "\n",
    "def cst_import_obj(modeler,file_path):\n",
    "    #file_path=\"C:\\\\Reaserch\\\\Code\\\\CEM\\\\AntennaGPT\\\\code\\\\polygon_triangulated3.obj\"\n",
    "    Str_Name='patch'\n",
    "    Str_Component='Patch'\n",
    "    sCommand = ['With OBJ',\n",
    "                '.Reset',\n",
    "                '.FileName (\"%s\")' % file_path,\n",
    "                '.Name (\"test\")',\n",
    "                '.Layer (\"Patch\")',\n",
    "                '.ScaleFactor (\"1\")',\n",
    "                '.ImportToActiveCoordinateSystem (False)',\n",
    "                '.Read',\n",
    "                'End With']\n",
    "    sCommand = line_break.join(sCommand)\n",
    "    modeler.add_to_history('Import OBJ File', sCommand)\n",
    "    # pick一个face\n",
    "    sCommand = 'Pick.PickFaceFromId \"Patch:test\",0'\n",
    "    modeler.add_to_history('pick face Patch:test', sCommand)\n",
    "\n",
    "    #  Extrude Face\n",
    "    sCommand = ['With Extrude',\n",
    "            '.Reset',\n",
    "            '.Name (\"solid2\")',\n",
    "            '.Component (\"component1\")',\n",
    "            '.Material (\"PEC\")',\n",
    "            '.Mode (\"Picks\")',\n",
    "            '.Height (\"tm\")',\n",
    "            '.Taper (5)',\n",
    "            '.UsePicksForHeight (False)',\n",
    "            '.DeleteBaseFaceSolid (False)',\n",
    "            '.ClearPickedFace (True)',\n",
    "            '.Create',\n",
    "            'End With']\n",
    "    sCommand = line_break.join(sCommand)\n",
    "    modeler.add_to_history('Extrude Component (\"component1\")', sCommand)\n",
    "def cst_delete_compo(modeler):\n",
    "    sCommand = 'Component.Delete \"component1\"'\n",
    "    modeler.add_to_history('Delete component1', sCommand)\n",
    "    sCommand = 'Component.Delete \"Patch\"'\n",
    "    modeler.add_to_history('Delete Patch', sCommand)\n",
    "def cst_run(modeler,mws,fullname):\n",
    "    #仿真开始\n",
    "    modeler.run_solver()\n",
    "    #仿真结束\n",
    "\n",
    "    mws.save(fullname)#保存\n",
    "def cst_export_s(modeler,file_path):\n",
    "    # 导出\n",
    "    sCommand = ['With TOUCHSTONE',\n",
    "                '.Reset',\n",
    "                '.FileName (\"%s\")' %(file_path),\n",
    "                '.Impedance (100)',\n",
    "                '.FrequencyRange (\"Full\")',\n",
    "                '.Renormalize (False)',\n",
    "                '.UseARResults (False)',\n",
    "                '.SetNSamples (1001)',\n",
    "                '.Format (\"DB\")',\n",
    "                '.Write',\n",
    "                'End With']\n",
    "    sCommand = line_break.join(sCommand)\n",
    "    modeler.add_to_history('Export TOUCHSTONE s', sCommand)\n",
    "\n",
    "\n",
    "def cst_export_farfiled(i):\n",
    "\n",
    "    for j in range(200,1100,5):\n",
    "        # 导出\n",
    "        sCommand =  ['SelectTreeItem (\"Farfields\\farfield（f=%.2f）[1]\")' % j,\n",
    "                    'With ASCIIExport',\n",
    "                    '.Reset',\n",
    "                    '.FileName (\"C:\\Reaserch\\Code\\CEM\\AntennaGPT\\data\\Farfiled\\data%s\\example.txt\")' % str(j),\n",
    "                    '.Mode (\"FixedNumber\")',\n",
    "                    '.Execute',\n",
    "                    'End With']\n",
    "\n",
    "        sCommand = line_break.join(sCommand)\n",
    "        modeler.add_to_history('Export farfiled ASCII', sCommand) \n",
    "\n",
    "\n",
    "def generate_polygon_with_external_fixed_edge(fixed_edge, num_points=20):\n",
    "    \"\"\"\n",
    "    随机生成一个多边形，固定边在多边形外部\n",
    "    :param fixed_edge: 固定边的两个顶点，例如 [(x1, y1), (x2, y2)]\n",
    "    :param num_points: 除固定边外的随机顶点数量\n",
    "    \"\"\"\n",
    "    # 转换固定边为 NumPy 数组\n",
    "    fixed_edge = np.array(fixed_edge)\n",
    "    p1, p2 = fixed_edge[0], fixed_edge[1]\n",
    "    \n",
    "    # 计算固定边的方向和垂直方向\n",
    "    edge_vector = p2 - p1\n",
    "    perpendicular_vector = np.array([-edge_vector[1], edge_vector[0]])  # 垂直方向\n",
    "    \n",
    "    # 在固定边的外侧生成随机点\n",
    "    random_points = []\n",
    "    for _ in range(num_points):\n",
    "        t = np.random.uniform(-0.2, 1.2)  # 延固定边方向稍微扩展范围\n",
    "        random_point_on_edge = p1 + t * edge_vector  # 固定边上的随机点\n",
    "        random_offset = np.random.uniform(0.1, 1) * perpendicular_vector  # 外侧偏移\n",
    "        random_points.append(random_point_on_edge + random_offset)\n",
    "    \n",
    "    random_points = np.array(random_points)\n",
    "    \n",
    "    # 合并固定边的两个点和随机生成的点\n",
    "    all_points = np.vstack([fixed_edge, random_points])\n",
    "    \n",
    "    # 使用凸包算法生成多边形\n",
    "    hull = ConvexHull(all_points)\n",
    "    polygon_points = all_points[hull.vertices]  # 获取凸包顶点的坐标\n",
    "    return polygon_points\n",
    "# 主程序\n",
    "if __name__ == \"__main__\":\n",
    "    # 路径\n",
    "    file='../../data/Refpa/'\n",
    "\n",
    "    path = os.getcwd()\n",
    "    filename = '../cst/Refpa.cst'\n",
    "    fullname = os.path.join(path,filename)\n",
    "\n",
    "    # 假设有两条固定的边\n",
    "    fixed_edge_1 = np.array([[-24.7, 20.5], [24.7, 20.5]])  # 第一条固定边\n",
    "    #fixed_edge_2 = np.array([[-19.3, 0.73], [-19.3, -0.73]])  # 第二条固定边\n",
    "\n",
    "    #polygon_points = generate_random_2d_polygon(num_vertices)\n",
    "\n",
    "    # 生成一个随机多边形，包含固定的边，且随机点的y坐标满足要求\n",
    "    # project = cst.interface.DesignEnvironment()\n",
    "    # project.set_quiet_mode(False)\n",
    "    # mws = project.new_mws()\n",
    "    # modeler = mws.modeler\n",
    "\n",
    "    # cst_init(fullname,modeler,mws)\n",
    "    \n",
    "    for i in tqdm(range(500)):\n",
    "        \n",
    "        file_obj=file+'data'+str(i)+'.obj'\n",
    "        file_s2p=file+'data'+str(i)\n",
    "        \n",
    "        sorted_points=generate_polygon_with_external_fixed_edge(fixed_edge_1, num_points=20)\n",
    "        #polygon, sorted_points = generate_polygon_with_fixed_edges2([fixed_edge_1], num_random_vertices=5)\n",
    "\n",
    "        # 进行带约束的三角剖分\n",
    "        triangulation = constrained_triangulation(sorted_points)\n",
    "        \n",
    "        # 导出为OBJ文件\n",
    "        export_to_obj(triangulation,file_obj)\n",
    "        \n",
    "        print(\"OBJ 文件已生成：\"+file_obj)\n",
    "        # 展示生成的 OBJ 文件\n",
    "        plot_obj_in_jupyter(file_obj)\n",
    "        \n",
    "        # cst_import_obj(modeler,os.path.abspath(file_obj))\n",
    "        # cst_run(modeler,mws,fullname)\n",
    "        # cst_export_s(modeler,os.path.abspath(file_s2p))\n",
    "        # cst_delete_compo(modeler)\n",
    "        break \n",
    "        \n",
    "        \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAGFCAYAAAASI+9IAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABP/UlEQVR4nO3dZ3gc5bmA4eebsn1VVqterGZbtuXeO+4FMO4FTAdTAiR0MDamt9B7Cb0TahIIkNCSkxBIpwUSese9S7alnfNjpfXKIgkQPN9I+z7nOtcVfn2vV7tz78xOUY7jOEiSJEkSYOgeQJIkSfJOgoIkSZKUSlCQJEmSUgkKkiRJUipBQZIkSUolKEiSJEmpBAVJkiQplaAgSZIkpRIUJEmSpFSCgiRJkpRKUJAkSZJSCQqSJElSKkFBkiRJSiUoSJIkSakEBUmSJCmVoCBJkiSlEhQkSZKkVIKCJEmSlEpQkCRJklIJCpIkSVIqQUGSJElKJShIkiRJqQQFSZIkKZWgIEmSJKWy3Fxs7fYmNu1odnPJdm35ZDPdanKwbFPrHJtWfUrD+pVaZwDYmpVFU25c2/qO42B8vIWarmXaZgDYurWBtWs2UFZepHWOlZ9tIlYYxrL0fV9zEgkaVq0nVBjTNkNrnya+ZJWzRusMiQ3Z+LfkaZ0BIBY2KYn5dvs6ynEcZ7ev0tKZr3/OZw073FquXY1/WcnqH/6WwTNqOOu+vbTCcN+R/Vn9/mva1m/t9+ddweaycm3rd3lgFXXXfUH9cSMZ98OJ2ubo2X1PNmzYxLPP3UavXrVaZnjrz19wwTHPMGiPLhxz7lhtMLx+zSN89Ye36HP8PAoG1WmZobX+m2fwZuKfWmcovuYyrC+7aJ0BwG8pfr28626HwdV33YDckJvLtctpTO6l/PFn73HB4idp0rjXUjtqjra10yv408ta17caEgC8cfXvePWal7TNsXnzVtat28jkCYfw5pvvaplhW2MTAH968SOuXf4STU0JLXM0NW7HSSR47YqfsvJPb2uZobWZlr4vCq1t6aX3M9LatiaHtVt2/zbLVRT2Kc1mWnGWm0v+237/xLtaYRiyeBnDDjhby9rp1Tz+ENO26/2bJFp22F658kWtMABs3LhFKwyt/fklvTAAnoDhTP+xnOQ7XNv6ABvHP8yCaVpHcDVXUVBKMacsh4mFUTeX/docR2AAUMDcHTnMCNdonaM13TA0Nzd7AgbHERgguc04338Cx/oO0LJ+a/OmKH60Z4HWGdzK9YOWSikWVuSyR37E7aXbJTAkUygOz+rNtFCV1jlaExiSCQzJlFJc6j+dJfZCLeu3duzUgoyAQcsvWUop9quMMTIe1rF8mwSGZEopjsruy8RghdY5WhMYkgkMyZRSXB04kwPt2SgtEyTLBBi0nfdmKMVBVXkMjYW0/pFBYGjNUIpjcwYwNlCm/W8CAkNrAkMyQxncGDiXBdZeKI3v0M4Og9aL1wylOLQmzoBcgQG8AYOpFCfkDmREoET73wQEhtYEhmSmMrkteBGzrMkCw25K+xXNplIsqYnTJyeofSMkMCQzlcHJuYMZ7C/S/jcBgaE1gSGZpSzuDl7KntYeGALD9552FAAsQ3FUbT49swLaN0ICQzJLGZweG0J/f4H2vwkIDK0JDMlsZXN/8CommCMxNG7GOiMMnkABwDYUx3TLp1vUr30jJDAks5XJGbFh1PvinnijCAzJBIZkfuXj4dC1jDYHYQoM31te+Kyn8hkGP+xWQHXEr30wgSGZX5msiA2nux3TuqvemsCQTGBIFlQBHg/dyBCzr8DwPaV729suv2lwfPcCKsI+7cMJDMkChsXZeSOosbMFBgSGdnNohiGsQvwidAv9jV6Y6LufWWeBQfd292sLmgYndi+kNGRrH1BgSBYybM7NG0mllSUwIDC0m0MzDFEV4anwrdQbXQWG/zHd29x/W8gyOKmukKKAwADegCFi+Dg/PooyKyIwIDC0m0MzDDkqi2fCd9DdqBIY/od0b2//YxHL5JQeheQHLO2DCgzJooaPC/NGU2yGBQYEhnZzaIYhpnL4Veguqo1ygeE7pntb+1+L2ian1BUS8+v8GSmZwJAs2/RzYXw0+WZQYEBgaDeHZhjyjRi/Dt1FuSrGEhi+dbq3s9+oHJ/FqT2KyPEJDOANGGJmgIvjY4gZAYEBgaHdHJphKDYKeD58D0WqQGD4lunexn7jYi0wZNkCA3gDhrgZ5OL4aHIMv8CAwNBuDs0wlBlFPB++m3yVJzB8i3RvX79Vcb/FKT0KCVs6r2FMJjAkK7TCXBQfTdTwCQwIDO3m0AxDpVHGc+G7iakcgeEbpnvb+q0rDNic2qOIkMAAeAOGEivCRXmjCStbYEBgaDeHZhhqjS78OnQ32SoqPz5/g3RvV79TxUGbk+sK8ZtK+z9AYEhWbke5MD6aoLIEBgSGdnNohqHOrOZXobuIEBIY/ku6t6nfubKQj5PrivAZAgN4A4ZKO4sL4qPwK/2/+4DA0JrAkKze7Maz4TsJEZBbYvyHvPDZ/c51Cfs4qa4Qy9B5Z/VkAkOyGjuH8/NGYQsMgMDQbg7NMPQ3e/JM+A78+OXuqv8mL3xu/6eqIn5O7F6ApQQG8AYM3Xy5nJc3Em8cSBIYWhMYkg0ye/PL0K34sAWGr6nDowBQGw1wfPcCTIX2jZDAkKyHL4+zBYZUAsMuc2iGYbg1gF+EbsHGEhh2qVOgANA9K8Bx3QowBAbAGzD09sc5MzYcQ+uDE3cmMCQTGJKNsYbwWOgGTM3vUK/B0GlQAOiVHeQHXfNRCAzgDRj6BwpYFhuGEhgAgaHdHJphmGiN5KfBazEEhlSdCgWAvjkhjqrN1z0GIDC0NjhQxGm5Q7TOkJ7AkExgSDbd3oP7g1e2fHERGDodCgADYiGW1MQ98c1UYEg2IljCybmDPfE3AYGhNYEh2Ux7EncFL9WydnpegKFTogAwJC/MIdV5uscABIbWxgTLOD5noNYZ0hMYkgkMyebb07k1cJH2A526Yei0KACMiEc4sDKmewxAYGhtfKiCY7P7a50hPS/B8PHHX2ibIx0Gx3H0zaEZhsW+fbghcI6WtdPTCUOnRgFgTEGU/boIDK15AYYp4UqOzO6rdYb0XrnyRZoadmhbvxWG5Uuv1DYD7IThg7fX6J1DMwyH+OZxVWC5lrXT0wWD5dZC763ayvZmhx5FYbeWTDW+MMqOhMNd5pcAGJZCKT27iM1NCX73+Lu8eMc/GbNHdy0z9Bu6lOa1Dn/8xVkAfLTlU9ZtzHZ1hq7ADF8xr5srUc2gTH3fT5zmBImGJgylMDTN4TgOGzdtgSIwNJ5XnWh2WLe6kWgYlKlpCCcJw9+ue5Tsa/dnaLjc9RGO8u3HNmc7p2y7GICmHU3ouGXSsVOTKFz55ErX1nQNhT99tIltTQl2NCXoUxZ1a9lUU4qzeHtUF54/ciOr39nM3H555Eds1+dorfqVUr58ZJu29Us5iU2qiT/n3MDSd6+n8augljlCo+sJr69g4K/y8TdoulGZBacUF/FqzwdpCq/XMwOA8wlffrgStpfqmwF46qt8pox8gVB0vbYZElaQr8YfzedBBxo/Y2jA/dfkR/6DWbtqFY+pX7Pjg9U0DdmB5XN/m9EKw9N/3UA8uvs32cpx6QDig3/6im0tP2L1K4togeG5tzdw4F3vYijICpg8fHh36or0bAw3PLCDDXc0aVk7vceGPsrDIx7WOsPkFyazzzP7aJ0B4PMRD/L56Pu0zvDq74fy+xfHap0BoH7YcwzY45fa1m8OxPhi9pPgOCjgEBWjN+5/Vle98wmr3vkEFPgjQbqMrNcCg5tp2Vf+26ebee3TTTqWBiDhwKbGZube8g5vf9mgZYbshTY5h7u2o/Zvm/XKbA7KXah1hmfHPYt5tL5j+q2V/H4B9UWHaZ1hyIhXOOroIq0zALzxhwnUlZyoewxQCge4nXW8jp7PKkqBA9s2N/DR796gabv+9+ruTNuBXN0wNHsAhqw5NrlH6//WsX/uPA6tXaR1BmtBEyWnufu7xtdVX3gwA+qP0DrDvPn5LF2q/wyt6oL9mTBI/5k4KEUCzTBAxsCg9ewjgQGiMyxiP9QPw0E187XDEF8QpnS5fhj61R+mHYaFC2tZsUL/NR39ux3I5CEXof/GMQgMLqX9lFSBASLTLPJOsrV/7rwAQ97sMOXn5qD7BlZegGHOnGrOP38ISiWPYOiqT+0ipg2/HO1/FAQGN9KOAggMAOGJFnmn2do/d16AIXevEBUX5mp/LbwAw957d+Hii4dph6FX1Wz2GnlNy9W+AkNnhsETKIDAABAeaxFf5tO+MfQCDDlTgnT5cW7yHZrhMEydWs5ll43AMJRWGOq67M2M0TeglOY/CgLD7swzKIDAABAaaZK/wpe8UCbDYcgeH6TyiljytdD4TvUCDBMmlHLVVSMxTYWh8bXoWj6VmWNuwVAmup+OLjDsnjyFAggMAMGhJvnn+JKXFmY4DFmjA1RdE0MJDIwZU8x1143GNA2tMNSUTmD2HndgGJbAAJ0OBs+hAAIDQHCAScF5PpSN1r+SF2CIDgtQdX2e9tfCCzAMH17IjTeOxrb1wlBZPJo54+7CNG2BAToVDJ5EAQQGgEBfk4KLfCgfGQ9DZJCf6hvjGH6V8TAMHlzALbeMxe83k/dJ0lRF4XDmjb8PywqglKZblLQkMHx/eRYFEBgA/D1NCi72o/xkPAzhfj6qb8nDCAgM/frFufXWPQgG9cJQmj+I+RMewDYFBqBTwOBpFEBgAPB3Nyi81I8KkvEwhHr5qLktjhFWWu5a2ZoXYKivj3H77eMIhy1MXXc0BYrz+rJw0k/xWWGBATo8DJ5HAQQGAF+NQeFlfowwGQ9DsLtN7W1xzIjAUFeXwx13jCMSsbXCUJDbi4WTHsZvRwUG6NAwdAgUQGAA8FUaFF7ux8hC68bQCzAEam1qbo9jZhsZD0PXrtncddc4srN9WmHIz+nOokmPEPTlCAzQYWHoMCiAwABglydhMHPI+D2GQJVN7R1xrJjAUFWVxd13jycW82uFIS+7ln0nP0Y4EBcYoEPC0KFQAIEBwC5pgSGPjN9j8Jdb1N4Rx44LDOXlEe6+ezz5+QGtMOREu7Bo8qNEgoUCA3Q4GDocCiAwAFiFBoWXBzDz9Z6J4wUYfCUWNXfm4ysyMx6GkpIwd901nqKikFYYssNl7Dv5UbJCJQIDdCgYOiQKIDAAWPmKosv8WMUCg6/QpOb2OL4ygaGoKMRdd42jrCysFYZoqJhFkx8hJ1IhMECHgaHDogACA4CZpyi8zI9dLjDY+Sa1t8XxV1oZD0N+fpA77xxPVVVUKwyRYCGLJj1CLKtGYIAOAUOHRgEEBgAzR1FwqR+7UmCwYiY1t8YJ1FoZf4FbLObn9tvHUVubpRWGUCCPhRN/Sjynu8AAnoehw6MAAgOAGVUUXuLHVyswWNkGNbfECfawMx6G7Gwft966B3V1OVqvfA76c1gw4QEKc3u13HpbXwLDf65ToAACA4ARURRc5MdXJzCYUYPqm/II9RYYsrJ8/OQnY+nTJ6b1JnoBXzbzJ9xPcV5/gQE8C0OnQQEEBgAjpCi4wI+/3sj4226bYYPqG/IID/BlPAzhsM2NN45h4MB8rTD47Ahzx99DWf5QubsqeBKGToUCCAwARkCRf66PQH+BwQgaVF2TR2SIP+Of4BYKWVx33WiGDi3U+gQ3nxVi9h53UFE0suXxnvoSGNrX6VAAgQHA8Cvyz/IRGCIwGAFF5VUxoqMFhkDA5JprRjJmTLFWGGwrwKyxt1JVMh55tCeegqFTogACA4DyKfKX+wiOFBgMn6Ly0hjZEwIZD4PPZ3L55SOYOLFUKwyW6WefMTfRrXwaAgOegaHTogACA4CyFPHTfYTG6v1TewEGZSsqLswlZ2pA6xxegMG2DS6+eBjTplVoncM0bPYaeQ11XWZonQMEhtY6NQogMAAoU5F3so/wJL3niHsCBktRfm4uuTOCWufwAgyWZXD++UPYZ59KrXMYhsX04VfQq2qe1jlAYIAMQAEEBkjCEDveJjxdYFCmomxFDrG5Ia1zeAEG01ScffYg5s2r1jqHYZhMHXYJfWv30zoHCAwZgQIkYfhg9VZt63sCBkMRO9YmOlNgUIaidGk28X3DWufwAgyGoVi2bAD77ddV6xxKGUwcfD4Duh+idQ7YCcNXaPzRVxMMlmsreaD31zRqXb/ZgfUNzcy6+S1uPzCPYV0qXZ9BKUXOETbKp9j4UBMAH6zaRCLkuDrH0MBkVhU08rOVj7m6bnpKKYpPykL5FKvu2Kxtjn71hwHwlzduAuD9NW/z1Xb3v8DseYDDpqYcfvbgetfXbk0pxbgBZ9Lkz+YLbVMkSzgOf3UaGICj72dwB7ZtauBfv/0LeUPLKIiU7vYlXUMh8I7Dthq3Vvv6YiETy0jQlNC7g7SpEZbPWstlt5n06Vfu+vpKKbIPtsCGd57YwLJH/8Qa3zbX54BsaqJDMQs+pOG5Zpjl/gRKKYqOi/LG5nuIvtKXpiwfEHd9jlYYXvj7DRz9+AI2N2v6hmpAl9ApNKzvybqP3oOeg1wfQSnFmF7H8sL2D2jwaTzEpxRrs3wod78vfW1NW7Zx5jtLOK/3rcR9Rbt1LddQqD7FYPs2B193k8pHs7Fy9WyYK2t/ztNfXq9l7dbWnXsGze8M4+I9d3DBs9vp0svn+gxKKXL2t/lL8WrWPK8DhGT9/m8E8/6+N465g82hjUSmZLk+g1KKN/Y+j63TVvHahl4sLnyOkJXn+hz96g/j9xu+YPMnf3V97VQKem/+jOp3o7y5+EvqXqogr77A9TECyuQsXzV/3nQfb2x5yPX1UxnwSG0zH29t1jcDkKCZBmMrm5o2dB4UjCaFvRacVxN8PnEjNS/mYuW5D8Pcqh8QDm7nyS8udX3t1nxNzTSiaNzksGzKF5z3TLEWGACOnNCdHU3N3PGbd7WsD9CkHMyE4vMln1Byc7kWGFpb3fg29/xzAou76YHh6JHLAbj6tytcX3vXmjbv4PFxdzPzhf21wODHYHhkP3zOFl7ffJ/r67dWlgNVWXvz1Cp9hzrdzP2tcjNse7uZ9/ZYR9OahOvLA0wrOp49i0/SsnZ6iWbF1o0Jlk35go/e3K5lBqUUx07pyaIRes8+UQ6QgM+XfMLmZzZqm8OhOQXD1qY1WmY4euRyjht9tpa129QM2zdu4/Fxd7PmjZVaRlBKMTC6hJ7huVrWb21qwQzmFh+mdQa30nMMR2BIlWjGEzCctGc9c4dUalk/lcCQyiswOM2OJ2AYknUM3UP7aFm/tdlFB2cEDPp+cRUYUnkFhtNm9GHGAL1XuAoMOxMYdqaUYnj2j+ganKZl/dYyAQa9p+EIDKm8AINhKJbP7sfUvqV670QjMKQSGHamlMGInJOpDkxE572SOjsM+i9eExhSeQEG01CcM3cA43sVCwwIDOl5AQZDmYzOPZ0ugTEIDLsn/SiAwJCWF2CwTIMLFg5idJ3e++4LDDsTGHZmKIs9cs+k3D8cgeH7zxsogMCQlhdgsE2DS/YdzLDafDQ+2ldgSEtg2JmhLMbFzqbEP0jrg3o6IwzeQQEEhrS8AIPPMrls8VAGVOYJDAgM6XkBBlP5mBA7n0JfX62P9uxsMHgLBRAY0vICDAHb5KoDh9G7PCYwIDCk5wUYLOVnYuwi8u2eAsP3lPdQAIEhLS/AEPRZXHvwMOpKcjB0/sggMKQSGHZmG0Em5/2YPLubwPA95E0UQGBIywswhP02NxwygtqiKKbOXQaBIZXAsDPbCDE571JyrWqB4X/MuyiAwJCWF2CIBm1uOnQkXeIRgQGBIT0vwOA3okyNX0G2VYFC3zNDOjoM3kYBBIa0vABDdsjHLYeNpCwWEhgQGNLzBgxZTMu7iqhZIjB8x7yPAggMaXkBhtyIn5sPG0VRdlBgQGBIzwswBMwcpsWvImwWCAzfoY6BAggMaXkBhvysAD9ZMop4NCAwIDCk5wUYQmYe0+NXEzLyBIZvWcdBAQSGtLwAQ2F2kFuXjCIW9gsMCAzpeQGGsFnAtPjVBI1cgeFb1LFQAIEhLS/AUJIb4pYlI8kO2gIDAkN6XoAhahUzLX4VfiNLYPiGdTwUQGBIywswVORFuOXwUUQCNqZcxyAwpOUFGLKsMqblXYVPheV01W9Qx0QBBIa0vABDVUGUWw4bSdBvygVuCAzpeQGGHLsL0+JXYauQwPBf6rgogMCQlhdgqC3K4ubDRhLwmXJLDASG9LwAQ65dzdT4FVgqIDD8hzo2CiAwpOUFGOpKcrjp0BH4LIEhOYbA0JoXYMizuzEl73JM5UPn5s/LMHR8FEBgSMsLMPQqy+WGQ0Zgm4bAgMCQnhdgyPf1YHLeZZhYssfwNXUOFEBgSMsLMPTtEuPag4ZjGgJDcgyBoTUvwFDoq2dy3o9bzkiS5zGk13lQAIEhLS/AMLA6zlUHDMVQOh+DgsCQlsCwsyJ/PybGLsQQGNrUuVAAgSEtL8AwrGsBly0egmEIDMkxBIbWvABDaWAw42PntRxGEhigM6IAAkNaXoBhdF0RFy8ahFI6P3YIDGkJDDsrDwxnXO5ZLf8lMHROFEBgSMsLMIzvVcL5CwZpWbtNAkMqgWFnXYJjGJt7ppa10/MCDJ0XBRAY0vICDFP6lHL2vAFa1m6TwJBKYNhZdXA8o3NO17J2erph6NwogMCQlhdg2Kt/Octn9dOydpsEhlQCw85qQ1MYmX2ylrXT0wlD50cBBIa0vADDrMFdOHXv3lrWblMaDM52Pe+L5BgCQ2tegKFbeC+GZf9Iy9rp6YLBcmuh5ma3Vvp3A8C2N5t5c/Zqan+VS9hnuz7CtKLjAbjL9ZXblmiGzesSLJ/2GRf+zc92K+z6DEN65XHglho2/30thuP68jtzgGZIbEpAts4xmlnV+CZ3/WM+w4oe1DLDiG5H8cWWrTTc86mW9Vtzmh22rWvk0fF3MvEPown7A67PkEcVPZjJP9TjAGza9CGmhjfqOP8IGnNW84v1j7u2pnIcx5V/6bKen9L9C4MePf3kxfXcwnbT9h38tv5LNs9u4piB9VpgALjtZ3fx0rV+CpwcLI238y2sWc37cxWrmqPaZnBeU8x7KJeeXyTwafzi8P6kX/DCtFdosFz7nvS1/W17NX/eqPd3l55vvcSY5w2CCb2HEjYXrCQ+4veEE/rOCLIHFeDvXUT4bYWhZ8cagH/EEnwWgWV1N1Oa03O3ruUaCpMnfMT6dQlMEy76cQFj93D/2+mbq9fyk7/9AwUUhkNaYVj5xdOs+vwpLWun99KWWn7bUKt1homPNTDl4QatMwA8VlvOE7UVWmf4rOx9PuvyvtYZAKo2/5KaLb/QPQZVOyyqmvR8RluLFBUQLS3WOkNr4yfdQm5u9926hutfBBIJOO3klbz04ha3l07lACu3buXaP7/Blu07tMxQUDyV/JLpWtZOb0zoXaaV5Wud4dezgjQfv3vf6N+kme9+wrwhPq0zlH5azZG1/bTOAPBBZBp7DNH/g+sHVhPVAxdpnWHzlyvpUqH/s+pWrqPgON6AIeEIDABKwdzKQqZWVGqdI3FsN7JO66N1BgUcNMbP7ClZWuc4vLYPZwweqHUGgDGDj2fhuBV6h1DQbeQS+o48SusYFeVT6dnrUK0zuJWWQ4YCw868AYPigLoeTCzTe+gk66Q++mFQiqMWx9h7gr7fWQBOHTTAEzDMH3uGdhiUUoza+0Lqh+ndKPfodWBGwKDtdySBYWdegeHgnr0YW1qmdQ6vwHDsgXlMGRPROofAsDOlFGP3uZQegxaj81YUmQCD1usUBIadeQEGQymW9OrNyOISrfco8gIMhqE44bA440eE0fl0UYFhZ8owGDfnarr2m4vAsPvSfvGawLAzr8BwVH0fBhcWZTwMpqE49Yh8Rg0KCQx4AwbDMJk0/0Zq6meg84/SmWHQjgIIDOl5AQbTMDi2Tz/65xcIDKbijB8UMKxfUGDAIzCYFpP3vZXKuqmg9G3COisMnkABBIb0vACDZRj8qF9/eufFMx4Gy1IsP66QgfUBgQFvwGCaNtMW30l513EogeF7zTMogMCQnhdgsA2TE/sPpEcspvWN4gUYfLbi7OML6VMXwND4YggMOzMtP3secC8lVSMFhu8xT6EAAkN6XoDBZ5qc3H8QtTk5GQ+D32dw3omF9KjxCwx4AwbLDrLXwQ9SWDEYpfTdMqYzweA5FEBgSM8LMAQsi9MGDqEyKxtD48EkL8AQDBhceEoRXSt9AgPegMH2hZlx6CPkl/YVGL6HPIkCCAzpeQGGoGWxdNAQyqMRDI0H1r0AQyhocPGpRVSVCQzgDRh8/ij7HPYYeUU9UYbA8L/kWRRAYEjPCzCEbZtlg4ZSEgpnPAyRsMmPlxZRXmwLDHgDBn8wh5lLfkZufleB4X/I0yiAwJCeF2CI+HwsHzKUwmAo42HIiphcdkYxJQWWwIA3YAiEYsxa8iTZsSqB4TvmeRRAYEjPCzBk+fwsHzKUeCCQ8TDkZCVhKMizMAUGT8AQjMSZdcSTRHPKBIbvUIdAAQSG9LwAQ64/wJlDhpHr92c8DHm5FlcsKyaWa8oeA96AIZxVxOwjfkk4WiQwfMs6DAogMKTnBRjyAkFWDBlGts+X8TDk5yVhyM02ZY8Bb8AQySll9pG/JBTJFxi+RR0KBRAY0vMCDPnBEGcOHkbEtjMehqJ8m8vPKCYaMQQGvAFDVqwLs454ikAoJjB8wzocCiAwpOcFGIrCYc4cPIyQZWX8dQylRTaXLysmHDLkUBLegCEnXsPsI57CH8gWGL5BHRIFEBjS8wIMpZEIZw4eRsAyMx6GihIfl51RTDAgMIA3YMgt6MasI57E9kXkArf/UodFAQSG9LwAQ3k0yrLBQ/GZRsbfEqOq3MelS4vw+5TAgDdgyCvqyawlP8fyBQWG/1CHRgEEhvS8AENVVjbLBg/FNsyMv7tq10o/Pz69GNtSGHJ3VU/AkF/al5mH/wzT8stN9P5NHR4FEBjS8wIMNdk5LB00BMvQeSDJGzDU1fi55LQiLIEB8AYMheUD2eewxzFMn8DwNXUKFEBgSM8LMHTLzeW0gYMxBQZ6dQtw4SmFmKbWh4UJDGkVVw5lxqGPYBiWPKhnlzoNCiAwpOcFGHrG8ji5/0AMpTIehr49gpx3YhGmITCAN2AorR7Fngc9iGGYyDOfd9apUACBIT0vwNAnns8J/QeiBAYG9g5y1o8KMZTAAN6AoaLbeKbvfy/KMBAYknU6FEBgSM8LMAzIL+BHfftrnQG8AcOw/iGWH1ugdQYQGNKr7DGFqfvdiVIKgaGTogACQ3pegGFwYRHH9umndW8BvAHDqMFhlv4gX+veAggM6dXU783kRT/RaQLgDRg6LQogMKTnBRiGF5dwVO++WmcAb8AwbliEU46Ia50BBIb0uvadw8T5N6JbBt0wdGoUoC0Mb7zWqG0OgSHZ6JJSDu/VW+sM4A0YJo2KcsKhAkNrXoChbsBCxs25SusMoBeGTo8C7IThjts2aJ0j4cBXWwSG8WXlHNyjp9YZwBswTB8X5dgD87TOAAJDer2GHMiYfS7VOgPog8FyayHl3wIE3VquXY4D2zfrN9ABvtyylb9/9i6V4WI9Q5jDCGQ10rjxeQASTc00NzW5OsKEkjK2NTVx37/+CcCabWsJNW5zdQYAjinCaNpC4tL3AEg0u/s6AOwzKYsdOxxuvG8tAF9ue4WujHF9jlMHDQDg/D/+GYDNmzdAvvt7MvPHngHAAy+cDcD7K/9JY8Ldz65ZMYSaUT/gvf+7DoAvP11PQamrIwBJGADeevNW19ZUjuM4bix00A3LWftZhG4FNezdbwqmrnuPhM4llPWenrXTevnlCazaoAmFlnqUvU/vyk0Ule2HZWVpmeGXn3/Ocys/oLLgE3yW+xvk1oYufIP8Vd1ZOe89Rv34GgzLdn2GGx/9C8//YQ2TDj6HqZUrKA9OdH0GgEkXn85riQDjPvotN138ENnZMS1zPPTS+dz/0o/512aTJkfPF7oxG8qpsrfwrw8O4qxrDqeiRs/hvn+8eSefffoiI0dfQjCUv1vXcg2FJXefwKbGzSgUgyr7cdyEw7EM13ZUUu3YfDM7Nl/h+rq79od/7MFv3pimewyG9i5jZN8KrTP8dcsb/HHL37TOUHzyDZibG0ApykZNZcTya12H4bPGF3lx7RGAQmEwOvdqLTCcsWxffv/y0xiGSUVFV668/BfaYLj+V5dx9bMXaVkbIP/j0eR/PBrDMAiH/Zx7w1xtMLiV6/w6OPzpw79x9XO30JRw/5uhHVmCHT3V9XV3bViPF5k0XP+x5Fde/5RtzXoPq/UP1zMmb6TWGVI5Dp/+39P8/txjSDTp+d0n+SlJ8Nt1x/FJw681zQCJRDMff/wvfnTCXmzYsFbLDEdPOpHjJp+mZe1UysFJwNYt21l+1MN8/N5qvfPs5rRsDbTDED4IO7rM9XV3bXjfHKaP1X8mzo6EgT8Q0jrDwJz+TCgYp3WGVAJDKoFhZ4mEkxEwaPuKqB+G/fBlnYPuc5KH9Kli7/H6z933B0PaYeif25fJhXqOo7dLYEglMOwsE2DQetxANwxWaB6+7AtJwqAPh4G9ujBrkv7bQHgBhj459UwrmqJ1hlQCQyqBYWedHQbt52hqhyG4D77sS9ENQ9+6cuZOGaj91gdegKFXdg/2Kp6G3lvotSQwpBIYdtaZYdCOAngBhun4cq4k+XLo2xDVdytl/rTBGJpl8AIMdVndmVGyp8CwcwiBoSWBYffmCRTAAzAEJuHPuRYw0fmy9KgpZuGeQzAMvZtDL8DQNVrLzNIZGOh9UA8gMKQlMOysM8LgGRRAPwxmYA/8uTeSvNBb30vTraqQ/fYeimEaWg8neQGGmkgVs8v2wVCm/r0GgSGVwLCzzgaDp1AAD8DgH4k/9xbARufLU1NRwOIZw5KPs8xwGCrDXZhTNhNTGQJDcgiBoSWB4fvPcyiAF2AYgj92Oyg/Ol+iqrI4B8wagWWaGQ9DRaiceeVzsJQlMCSHEBhaEhi+3zyJAngABl9//LE7QQVJ/s6gp4riGAfNHoFtWS1PhtKTF2AoDZYwv3wOtiEwtAwhMLQkMHx/eRYF8AAMdm8CsbtBhdAJQ2lhLgfPGYnfNjMehuJgEQvL5+EzfAJDcgiBoSWB4fvJ0yiAfhgMuweB2D2gIuiEoTg/m4PnjiLglz2GgkABCyvm4Tf8AkNyCIGhJYHhf8/zKIAXYOhGIO8+MHLQCUNhXhaHzBlFKGBnPAz5/jiLKuYTNAMCQ3IIgaElgeF/q0OgAB6AwaomELsPjDx0wpAfi3LovNFEQn6tF7l5AYY8f4x9KxYQNkMCQ3IIgaElgeG712FQAC/AUEEg7z6UkY9OGGLZYQ6dO4pIOJDxMOT4cljUZQERKywwJIcQGFoSGL5bHQoF8AAMZin+vPtRZjE6YcjJCnHovFFkRYMZD0O2ncW+FQvIsqMCQ3IIgaElgeHb1+FQAC/AUEQgdi/KLEcnDNmRIIfOHUVudijjf2OI2lEWVSwgx84WGJJDCAwtCQzfrg6JAuiHQZkFBPLuRVnV6IQhGg5wyNxRxHMjGQ9DxAqzqGI+MV9MYEgOITC0JDB88zosCuABGIwYgdhdKKsrOmEIB/0cPGckhXnRjIchZIVYWDGPuD8uMCSHEBhaEhi+WR0aBfACDDkEYneirB7ofDlDAR8Hzh5JcX52xt8SI2gGWFA+h0J/gcCQHEJgaElg+O91eBTACzBkEYjdgWH3RedLGvTbHDhrBGWFuRkPQ8AMML9iDsWBIoEhOYTA0JLA8J/rFCiAF2AI48/9CYZvEDpfVr/PYv+Zw+lSkpfxMPgMH3PLZ1MWLBUYkkMIDC0JDP++ToMCeAGGEP7cmzB8w9H5BDefbbHfjGFUleVn/IN6fIbN7LKZVITKdbMgMKQlMOzMazB0KhTAAzCoAP7c6zH8Y9EJg22Z7Lv3ELpWFmqbAbwBg21YzCqdQVW4SuscgMCQlsCwMy/B0OlQAC/A4MOfczWmfxI6YbBMkwXTB9OjpljbDOANGCzDYp/SvegWqdU6ByAwpCUw7MwrMHRKFMALMNj4ci7DDEx3fe30TNNg7tSB9O5WqnUOL8BgKpO9SqZTF+2udQ5AYEhLYNiZF2DotCiAF2Cw8GVfjBmY5fra6ZmGwaxJA+jXo1zrHF6AwVAG04un0Curp9Y5AIEhLYFhZ7ph6NQogBdgMPFln4cZXOD62ukZhmLGhH4MrO+idQ6vwDC1aBJ9s3trnQNoC0Oz++/PliEEhpYEhgxAAbwAg4EvawVWaH/X107PUIq99ujD0L7VWufwAgxKKSYWjmdAbj+tcwApGP7xwI06h0jB0NC8StsUAsPOdMFgubaS5hwc/vjhX7nsues5fMhoTUNMxbLWYzX9XM/6JDeGU0f3wjINfveXd7XN4Q8mUdjWuBWApg0NJDR8RxllDEIFHT53feVdchzWvPknmObXOQQOzazZ8YbGGZIwfPjh2xz3w7244tJnicUjrs9w9KQTAbj/J78DR9/JIomEw+ZN21h6xEOcftU0evXa/WfQuYbC8OpB/PJfr9Ls1oL/ps/X/opn/u8UrTPsqN6LPpF1rFy7lskazhhVSjFiYCW//9cfMbdFMU3H/SHYCUPDmg2se/ljnG163h3dCbO+biBb//EXnB02jq6NwGcOzStNElG9O/DF9Q4f/d0mGLDx23pmcRz44O3tHDHnCW55bDY5saDrMxw96UQ2fAx/uHMrTpONzjMJtzVsZf7SE/nVLTdSUlCwW9dSjuO4tkX48dp1XL5+g1vLfW2TVl3PtNVXa53hrthZvB0cjglcX9WLydlx12fY3LiFy5+8CYD8rDwOHDOfkN/9Dx7Aptc+Z/Nrn2lZO72X1wV5dYPew1ob1Go2GnrPU3/r7RBr19mYBtx4Wh2Th+W5PsPqlVuY3Oc2AGq6x7TBAHDN/fdz5T33aFl715646irqa3fvadWufg04KTeHY7Kz3FyyXb/KP5r86jO0ztBaAjj6gzd5doPejcDqTWu58zcPsXVbg5b1o31KiPTRe8oswLCcBkb31/zAICfO5P56f/NpLZGAIy96m2f/sEbrHB++u47DZz3K+rV63p/HLlrEjxYv1rK2jlxFQSnF0lguh2VF3Vy2XQXVp9C725laZwBw8AYMjuMIDIBSMGlohJFD9H5xmdi3irmju2qdAVren45+GJqbHYHBxVw/YKiU4py8GAdG3f/xKL36rksFhvQ5BAYg+f7ca1IeQwfo/eIya1RXb8DgCAytZQoMWn5FUkpxQTyPhZGwjuVTCQy7zCEwAMn35z7T4gzsq/eLi8DQNoHBnbSd5mAoxaX5cWaFw1rvXikw7DKHwAAk359z9synXy+9X1wEhrYJDLs/ree+mUpxdUGcPcMhgQGBIT1PwGAo5u1TQH2dwAACQ3qdGQbtVzRbSnF9QT6TQkGtwwgMu8whMABgGopFswro0TWk9aFFAkPbBIbdl3YUAGyluLmwgDHBgMCAwJCeJ2AwFfvNKaS2KigwIDCk1xlh8AQKAH6luK2wgGEBv8CAwJCeF2CwLMUB8wqpqggIDAgM6XU2GDyDAkDQMLi7qJCBfj+mxjkEhl3mEBgAsG2DgxYUUVHqFxgQGNLrTDB4CgWAkGFwX3Ehvf0+gQGBIT0vwODzGRyyqJjSIoEBBIb0OgsMnkMBIGIYPFBUSJ3PFhgQGNLzAgx+v8Gh+xVRVODDEBgEhrQ6AwyeRAEg2zT5aXERNbbAAAJDel6AIRgwOXxxMfE8W2BAYEivo8PgWRQAck2TR0qK6GJbAgMCQ3pegCEUNFmyfwmxXIEBBIb0OjIMnkYBIG6aPFpcRKklMIDAkJ4XYIiETZbsX0x2tiUwIDCk11Fh8DwKAIWWxWMlRRSapsCAwJCeF2DIiloceUAJ0agpMCAwpNcRYegQKACUWBaPlxSRLzAAAkN6XoAhO8viiANKiIQFBhAY0utoMHQYFADKbZtHS4rINQyBAYEhPS/AEMuxWXJACaGQgaHxkyUwtE1g+HZ1KBQAqlpgyBIYAIEhPS/AEI/ZLNm/hIDfkD0GBIb0OgoMHQ4FgK4+H4+WFBE2lMCAwJCeF2AoiPtYsn8JPp8hF7ghMKTXEWDokCgA1Pl8PFxcRFApuVcSAkN6XoChqMDH4fsX47OVwIDAkJ7XYeiwKAD09vv5aXERfoEBEBjS8wIMpUV+DltcjGUJDCAwpOdlGDo0CgD9An4eLC7EJzAAAkN6XoChvCTAYfsWY5oCAwgM6XkVhg6PAsDgQIB7iwqx0PsPEhh2mUNgAKBLeYBDFhVhGAgMCAzpeRGGToECwIhggLuKCjFBHu2JwJCeF2Co7hLkoAVFWlEAgWHXBIb2dRoUAMaGgtxWVICBwAACQ3pegKFrdYgD5hVpPVUVBIZdExja1qlQAJgYCnFzYT4KgQEEhvS8AENd1xD7zimUPYaWBIadeQWGTocCwPRwmOsL8nWPITDsOofAAEB9XZiFMwu0fmkBgWHXBIZknRIFgH0iYa7Kj2v/4AkMu8whMADQt1eEeTP0f3ERGNomMHRiFADmRSP8OJ6newxPwvDixrX65hAYABjQJ8rsPeNaZwBvwvDSn9dpmyPTYejUKADslxXlgryY7jE8B8NpH7+jdw6BAYAh/bPYZ6r+Ly5eg+GUa97VOkcmw2C5udiXzhrWOBvdXBKAIVE4MgE3rkseTPrqo7XQrdj1Oeq7LgXAXN0MTgJL6TlPygGaWpZVgFJ6vhs4jsOqjWv49T+eY6++UzGUq29HIAkDwObXPnN97daGD8qmqcnhyV+37L2t/xCKu7s+x6xRSRTOfeczwElecKfl/enQ7CT/t2EqlKZf5ROJBO+9s5brDr+N0+/YHyOa5foMxy5aBMCV99zj2pqufgqP2H4Z7zgfu7nkzoKQ/e4Emtf14c5Lf0PdtftS3q3Q9THquy5l2O9+QHbRE2zfPI4RI/pgaDhHsXnrVpqeepSyTeuIjd+TYEWN6zMAbGMzZaVRVjvvE6daGwxXvvg2o4J+3vrzh/xgci/XZxg9LIemVe/x2utriDx3CeRfB3E9MLz480/4q9lIuRFk4B6lWt6fAA3jsviicRMNiYSW9QHy//U2e61/kfVnvkXOORdqheHp3/2OeE7Obl9POY7j7PZVWrq+6TGubnrEreXalf2bEF2PKUYZEIoGWXbvwVpgOPucn/Pqqx+gFIwYXsMpp0zFsty93+v2Nav428yhyf8wTbqeez25oye5OgPAJucrNjkrAbDwE1d6YOh69s9ZvWUbAGdM6cVJE3q4PgMfvABPHAbKAF8U5t2vBYZbTv0db/7uC5SCPmNLOeCsoZiWnr3JP2/eyp82b9WyNkDPpx6n59M/A6UwS8vIOlsPDG7m6l/6aGsWx1lz3Fzya3MS0LC5kfP2u51P/vmVvjkc+P3L73HJJU/T1NSsbQ4SCf61/GjW/fZX+mYAmtjGaud9Ek6T1jnOf+ZNLn3uH/oGcBKwfTP8dBGs1vfbj+PA31/6jLvOeoXmJj3f1gdGQgyKhLSs3ZpjGKhEgsRnn7JxxekkNrl/CNzNXOffKzAkmh2BIX0IgaFN+mFo9gQMCAw7yxAYtOwTCgxtExjaJjC0JDCkEhjcS9spqQJD2wSGtgkMLQkMqQQGd9J6nYLA0DaBoW0CQ0sCQyqBYfen/eI1gaFtAkPbBIaWBIZUAsPuTTsKIDDsmsDQNoGhJYEhlcCw+/IECiAw7JrA0DaBoSWBIZXAsHvyDAogMOyawNA2gaElgSGVwPD95ykUQGDYNYGhbQJDSwJDKoHh+81zKIDAsGsCQ9sEhpYEhlQCw/eXJ1EAgWHXBIa2CQwtCQypBIbvJ8+iAALDrgkMbRMYWhIYUgkM/3ueRgEEhl0TGNomMLQkMKQSGP63PI8CCAy7JjC0TWBoSWBIJTB89zoECiAw7JrA0DaBoSWBIZXA8N3qMCiAwLBrAkPbBIaWBIZUAsO3r0OhAALDrgkMbRMYWhIYUgkM364OhwIIDLsmMLRNYGhJYEglMHzzOiQKIDDsmsDQNoGhJYEhlcDwzeqwKIDAsGsCQ9sEhpYEhlQCw3+vQ6MAAsOuCQxtExhaEhhSCQz/uQ6PAggMuyYwtE1gaElgSCUw/Ps6BQogMOyawNA2gaElgSGVwPD1dRoUQGDYNYGhbQJDSwJDKoGhfZ0KBRAYdk1gaJvA0JLAkEpgaFunQwEEhl0TGNomMLQkMKQSGHbWKVEAgWHXBIa2CQwtCQypBIZknRYFEBh2LR2G5maBQWBoSWBIJTB0chTAmzA0btmmbY5WGK677gVtM6TD0PDRe/rmYCcMDo7WOc5/5k0e/dsn+gZIh2H7Zo1zCAypNMFgubYS8EVjgtU73P9Dj2ZvvjISPM0zrq+dXqLZYcuGBlb9+SMI2NrmcBx49Y8fMkbbBC1DNDez5vknyT5wASilbZQmtuGgac8prQf/8hGz8zQO4DTDtg3w+Z+BbhrngL+/+Bl3rniF/c8ajG27upkCkjAAbIXke1VXiQSJTz5m44rTyTr7IoxodLcv6eqrfcDfN/HOFj36w3ii5iYS/vcwtundQVJbdmhFAWC78rHJjBBt1vitEGh670OtILRWW+jj1fcbtM7wYXOMbdj42aF1jpLoJ7ypE4WWXv7rWzz1m3u5f9wV2Ib7n5eBkRCvm1GMhK5t1s4SX3wOjjtzuIrC1Hwf72xpdHPJNm1S+/CHK67Ctm7SNgMADkz2LWZv60BtIySMZjaWdWOb2kFeIpd+vp4o5T6Wzz76G25d+BCG7ePA42dTP1DPxih4jUHVJzvo0t3HJQ9XkBVz/9vplk1b+OdnQwioJmL5MfLiMddnABh15Xv0WgUqbBI9tRarLOj6DCsb1tDrycls/3gbi16E+/fQA0PJxw5rnlJgGRTdfCzhyQNcnwEA08DIynZlKVff+SdUBdiecLjhY33H1JuMH7JvdYD71l2obQaAJ7mZg/IPYtt6n5b1E2YzzXkhHGC1k+AN4yv6W/UYLsOQCGWzdWuCRGIr1624j6OW7Uf/4T1dnQFg61oDa6vFl68lWD7jC258voqcPHdh2Ow08Wkgi2Zg1UZwggbxAvePJym1noi5AbaDc9mHhM6tw+riLgxbt/rY7ktuJx796BkWvXi8NhichAUNCb448FpKHjqNyIyhrs/gZq5uAZRSnFYT5JAyv5vLtmtB7kkcX3SG1hkA/Dk7KM/X822wTQq+dFbx16Y3SLi0i7rL8uBAwklww3n38teX33J9htaam+Gjt7dx5PgPWL9G71lJq79azeqVa/QNkABnazMblr9N00f6Dq05OCkYdiQ0HFpTtJwc4fD5/IvY/LNX3J/BxVw/XqCUYkXXIItL9HxDbu3YwlM8AUN5fp43YEAvDIDA8DUJDMm0wwAZA4OWX1yVUpzXPcT8YoEBBIY2CQztEhiSCQzupO00HEMpLq4LsU+hjc5zTwSG9gkMyQSGtASGtCE6Nwxaz800leKKHmGm5QsMIDC0SWBol8CQTGDYvWm/otkyFNf0CjMhz9I6jMDQPoEhmcCQlsCQNkTnhEE7CgC2obihd4RRMYEBBIY2CQztEhiSCQy7J0+gAOA3FD/pHWFojsAAAkObBIZ2CQzJBIbvP8+gABAwFbf3jdA/yxQYEBjaJDC0S2BIJjB8v3kKBYCQqbi7X5TeURNT4xwCQ/sEhmQCQ1oCQ9oQnQMGz6EAELEU9/SL0D0iMIDA0CaBoV0CQzKB4fvJkygAZNsGD/SPUBMyMDWeryowtE9gSCYwpCUwpA3RsWHwLAoAObbBgwOidAkIDCAwtElgaJfAkExg+N/yNAoAeb4kDCV+Qw4lITC0SWBol8CQTGD47nkeBYBCv8HDA6IU+pXAgMDQJoGhXQJDMoHhu9UhUAAoDhj8dECUuE/JoSQEhjYJDO0SGJIJDN++DoMCQHnQ5KcDouRaAgMIDG0SGNolMCQTGL5dHQoFgMqQyUMDomRZcigJBIY2CQztEhiSCQzfvA6HAkBt2OSh/lHCAgMgMLRJYGiXwJBMYPhmdUgUALpHTB7oHyFg6v1HCAztExiSCQxpCQxpQ3gbhg6LAkB91OKB/lH8hsAAAkObBIZ2CQzJBIb/XIdGAaBvlsW9/aPYAgMgMLRJYGiXwJBMYPj3dXgUAAZlW9zdN4KlBAYQGNokMLRLYEgmMHx9nQIFgGG5Nrf1jWAo5NGeCAxtEhjaJTAkExja12lQABgTs7mlt8DQmsCQlsDQLoEhmcDQtk6FAsCEuM0N9WEUAgMIDG0SGNolMCQTGHbW6VAAmJrv4+peYd1jCAxfk8CQTGBIS2BIG0I/DJ0SBYAZhT4u7xHSurcAAsPXJTAkExjSEhjShtALQ6dFAWBOsZ+L6kK6xxAYvqZWGBzH0TOAB2HYvKlZ2xzgMRg+bdQ2RjoMzY6mv4lGGDo1CgCLSvyc2y2oewyB4Wv60lnFF4mV+gZIg6Fph74NcisM1y39StsMra3+ajXbt2v6hgwpGDZe8i99M7AThoc/fFrjEHpgsFxbCVizeiUb1q9zc0kARgNH5wS5fn0UgIZtWyCa7focxxaeAsAVX54PwEesw2aV63OQDwHlZ4P7K7drM1tpTmg6jAQpGBq2NAIBbWM0N8OXH+3A5Y/k17Zt2zb8OgdIgLNF43uiJQeHt9a/y4SmAn2HoR0HmpMwVL55Pb6a4t2+pKvvwPPOPImPP3rfzSXbVDFhPut6jOa+F++j517LiQSyXJ+hFYab19/BefbLmGg6dJEHB2zqSn6z4q3mv7Kd7VrGaBqcIPu9OHZC74kBdaHPee1vPhob9LwOAP/4Et56I0BhFygr6oZpaAJios37TRvZ3KRvw2wkopz44Uhej72PqqrEF9Kzt//ZPiv5YItFoZVHvl2GUnp4MCJB7MoCV9ZSjosHdR+451Z+ev/tbi3XLqvIIjIiikJRnFvOqdMv1AIDwB38kZ/wqpa10/vkiyf57EuNu8jAzNgxzIufoHUGgF88/Bt++ej/aVu/pqCJ+cMaAUVebikLpi8nGIhqmeXh91by4Hv6Du1lN27lqmcfwAGcYJDw8cdglOz+b8m79urGZ/njpmcBRXWgnsmxxZhK572Zd3+u/qawYL9DmDl3PzeX/NocHL5c/ykXP3U6mxs3apnhIAZzGEO0rJ1eWdF0Di04RusMj6+9lhhbtc4AsOec0Rw+a6LuMQCHtes/58GnzqWhcZOWCebWFLCgxp1vpv8pBajGRhquvJbE519omcHAABzeb3yDZ9feo+/HZ5dyFQWlFIsPOpI995nn5rJfW8JJCAwk/ybHlyzjuPzjtM6Rpxqpt3O0zqCU4qTFMzhi7wla5wBwnITA0JJyHGjcphWGZJkBg+tnHymlOPjw45gyfabbS7dLYEimlOKy0is4Iu9IrXP08uV4AobzDp3PwVPHap0DBIY2JRICg0tpOSVVKcVhR53AuEnTdSzfJoEhmVKKa8qv5aDYwSiNl/x5BYaLj1jEvhNGaJ0DBIY2CQyupO06BcMwOOrYUxk1dpK2X/RbExiSGcrgpoqbWZi7MONhMAyDK35wAHPGDNH+/hQY0hIYdntaL14zTZPjTjyDoSPGav/gCQzJTGVye5c7mZ0zO+NhME2D6350MHsN76/9/SkwpCUw7Na0X9FsmhbHn3IWAweP0P7BExiSWcrinsr72DNrr5YzL/TkBRgs0+TmEw9j8qDeGAKDwNCuzgeDdhQALMvipKXn0rf/YJTSO5LAkMxWNg9WPcTE6MSMh8G2LG479QjG9ushMCAwtK9zweAJFABs28cpyy6kZ31fDENg8AIMfsPPI9WPMSYyBhN9F+x4AQa/bXPX6UczvL4rhiEwCAy71nlg8AwKAH6/n6VnXULX7j0FBrwBQ9AI8kT1zxkSHprxMAT9Pu5bdiyDulVjCgwCQ7s6BwyeQgEgEAiy/JzLqarpJjDgDRjCZpinan5J/9CAjIchHPDz4Iof0qe6AlPz+1NgSEtg+N7yHAoAwVCIFeddQUVltcCAN2CImlGernmG+mB9xsMQDQV4+Ozj6dGlRGBAYGhfx4bBkygAhCNRzrrgakrLKjAMvTegEhiS5Vg5/Kr2OboHumNpvMWzF2DIjoR47NwTqS0tFBgQGNrXcWHwLAoA0WgWZ190DUXFJQID3oAhZsV4rvYFqv3VGb/HkBsN88T5J1FZlC8wIDC0r2PC4GkUALKzcznnomuI5xcIDHgDhnw7n+e6vkCFryLj9xji2VGeOP9EyvJjAgMCQ/s6HgyeRwEgNxbnvEuuIzcvT2DAGzAU28W80PUliu3ijIehKJbDzy84maJYtsCAwNC+jgVDh0ABIC9ewHkXX0d2Tq7AgDdgKPOV8ULXlyiwCzIehpJ4Lj+/4GTyc6ICAwJD+zoODB0GBYCCwmLOvfhaollZAgPegKHSX8nzXV8kZsUyHoaKwjg/u+BkcqNhgQGBoX0dA4YOhQJAcUkZ51x0LeFIRGDAGzDU+mt5vuuLZJvZGf/jc3VxAT+/4CSyw0GBAYGhfd6HocOhAFBW3oVzLryGQDAo1zHgDRjqAnU81/UFImY042HoWlbME+efRDjoFxgQGNrnbRg6JAoAFZXVnH3h1fj9AYEBb8BQH6zn17XPETJCGQ9Djy6lPH7eiQT9PrlXEgJD+7wLQ4dFAaC6phtnXXAVtu1DCQyegKF/qD/P1v4av+HP+Lur9qmu4NFzT8Bv23J3VQSG9nkThg6NAkBttx6ced4V2JYlt93GGzAMDg/m6Zpn8SlfxsMwoGslj5x9PD7bEhgQGNrnPRg6PAoAdT17s+ycyzAtUx7UgzdgGBEZwZM1v8RWdsbDMKRHDQ+uOA7LMgUGBIb2eQuGToECQK/e/Vm64hIMQ2AAb8AwNjqWx6t/hqnMjH+058j67ty37BhMw9D+/hQY0hIY2tVpUADo238wpy67AKX0f/AEhmSTsibxcNWjmAgMe/TryZ1Lj8JQCs1vT4EhPYGhTZ0KBYCBQ0Zw0unnAKrl//UlMCTbM3tPHqh6ENXyf7ryAgyTB/XhtlOO0PxKJBMY0hIYUnU6FACGjhjL8aes0P5tDASG1mbmzOKeynu1zgDegGHP4f256cTD8MIbVGBIS2AAOikKACPHTOCYE87QPQYgMLQ2P3cBt3e5Q/t3ZC/AMGv0YK774UHa9xZAYGiTwNB5UQDYY/xUjjruVN1jAAJDa4tj+3Nj+U1aZwBvwDB/3HAu/8H+WmdoTWBIKw0GZ5Oe1yKZHhg6NQoAE6fszWFHHa97DCAJwxfrPsl4GA6NH8bVZddonQG8AcP+k0dz8ZJFWmdozXESrF33mcAASRgaGmn6w6s4WgdxeL/xdVdhcPW2lmu2bGFjQ4ObSwJQN2wse69fz1PP3OX62rvm4PD5uo/5w2evUFrZR8sMQ6lgldrME8ZbALz9wSa2NNquzjCM/fihtZ6rmpYD8K+PNmEZ612dobV4NMDq7MbkfzgJ19c/dM9xbGtq4qbHHnB97V1zcFiz7lNeeuGXTJgwC9vn7vsCkjBYjY1sN0x8CY2nZzoO/g07cDzw3fn9xtdZ+eUHFBfX7va1lOM4rkF4ymOP8/G6dW4t167mt/9OvPlzZu47n0g0qm0OgCuLPuU9Q8/eQmuWbdD8RYC3luSzY6Wm217v+TDm0N8RvXkp5oY8PTMAT1zcwLouNQz651vEx+6P0nAH3isf/iWPPf8AfUr+ic9ucn391noVz6Q6bzzBsJ8BI3prgQHg6Vff4oNXX2evR58lsmWrlhkcBc/1DrDR1PzrzzYH/z8dZj5yKZGi+G5dytUtwdCqSq0omHV9GVI3kyHdu2mbobU9MHmP17XO0LQjwVe/8OsDAeDJudi/moPp17uT3uWNPzLwvd/jAM2/bcIcfbDrMPxo7jTqCj/iiedfpknjF+SAmYehTLZtbeLvf3ibvsPqtMAwdUhPtv7hdRo+WIP7+287q9jYxNthn8YJkjUD29Zv2u0ouLpfNKdfP+YN6O/mku165u0PaNih9zkMAPvSkx9aI3WPQeFB6/jBkWVaZ2jcrjh8Xo3WGVpTgPPxazT/9nYcDYcupo4+kjmTT3N93X/X1i0N/P0Pb7Nj+w4t64eOW0DweL2/udQ27GDAwilaZ3Az1w+WeQGGbc0mQV+21hkA9rP7capvnO4xOPLwUs46urvWGWZPKufC4/X8xtI+RysME4cfwoJpZ7q+7tfmCAwAPaaMZOjJB2qdwa20/ILiBRgCvjAhv34YFvj6sdw/UfcYLFvSXTsMh8yu5rJT+nni3H3dMOwxZDH77X0euq/KBwSGlurmT2b4GYdpncGNtP2s7gUY/HaYkD9H6wwAs+zenOOfov3GHF6AYfHelVxzxgCU8sIFv3phGDVgPgfNvLjlYj/dN0sSGAC6zRzHqLOPTL45tb8/d09az7XyBgwhwv5crTMA7GX35AL/dO33xPECDPOmVnDjikECAzC070wOmXN5yw0eBQYvwFAzfTRjzvsBHnmDfu9pPwHXCzD47CDhgH4YptjduSSwF4bAwMwJZdx67hAMQ/8dRXXDMKh+T5bMuxrD0P3OQGBoqWrycPa46Icoo/PBoB0F8AgMVpBIIKZ1BoDxVi2XB2Zgan00jTdgmD6mhDsvGIplKjQ/5hjdMPTrMZkjF1zf8rwQzR9bgQGALuMGM/7SEzBMAw+8Qb+3PIECeAMG2wp4AobRVjVXB2ZiYmJo/GboBRgmjSji3kuGY1kGmh/DjW4Yencbxw/2vQXT0P/oWYEhWdmo/ky48mQM00zuNXSCtH/M0vMODPqurG1tmNWF6wKzSD7MMrNhGDu4gAcuG45PYKBHzUiOXXwrlmkLDHgDhpKhvZl0zakYttUp9hi0f8R2zRsw+IkG4+j+YW+QVc6Nwbn4sTIehpH983n4ypEEfCam9netXhi6VQ7lhwfciW35MQQGT8BQNLAnk69biuX3ofR/c/mf8uT0XoDBMn1Eg3nohqGvWcLNwbkEBAYG987j0atHEQxYmNq/kemFoaZ8AMcfeDe2HcRQmq/QFxgAKOjbjSk3nIEZ6NgweHZy78AQ137GRy+ziFuD8wnhw8xwGPr3yOWJa0cRDpkZD0NlaR9OPPhe/P6QwIA3YIj3qmHazcuxQgGU/l3a75Snp/YGDLYnYOhuFnBbcD4R/BkPQ33XHH523RiyIham7rtXaoahvKgnJx58P8FAVGDAGzDEulcy7ZYzsSOhDgmD5yf2AgymaRMNxbX/sFdrxrkttIBsFch4GHpUZ/Hz68eQm+XLeBhKC7px0iH3Ew7lCAx4A4bc2nKm/2QF/qxIh4OhQ0zrCRiMlj0GzTBUGTFuDy4kpkIZD0PXLlGevGEM+bn+jIehKF7DyYc8SDSSh6HhWRBtEhgAyK4sYdptZxGIZXcoGDrMpN6AwfIEDOVGDrcHFxJXkYyHobI0zC9uGENRXiDjYciPVXDyIQ+SHSkQGPAGDFllhUy/dQXBeG6HgaFjTNmSV2DICuZr300vMbK4I7iAIhXNeBjKi0L84oYxlBYEMx6GvJxSTj70QXKzigUGvAFDpDif6beuIFyY1yFg8P6Eu+QFGAzDJBqMa4eh0IhyW3ABZSon42EoKQjyi+vHUFkSzngYcrOKOPmQB4jnlmt/jwoMycKFeUy7dQXR0gLPw+Dt6f5NnoEhFMcwND7KEsg3ItwWmk+lEct4GArjAX523WhqKyIZD0N2tICTDn6Awni1wIA3YAjFc5n2kxVkdynxNAzeney/5AkYVHKPwdQMQ64K8ZPgfGqMeMZf4BbP9fPEtaOpq4pm/HUM0XCMEw++l5KCbgID3oAhkJvF1JuXk1NT7tkL3Lw51TfMGzAYRIJxTMP9B5unl60C3BKcS51RkPEw5Gb5eOzqUfTulp3xMISDORx/0N2UF/fUfoKEwJDMnx1h6o1nEKur9CQM3pvoW+YVGKLBPO0wRFWAm4Jz6W0UZTwM2VEfj1w1kgE9czP+JnqhQBY/OuBOqsr6Cgx4AwZfNMyU65cSr6/x3N1VtX9cvo+8AINqgcEyfFrnCCsf1wfnMMAozXgYIiGbBy8fwfC+8YyHIeCPcNzi2+naZbDAgDdgsMNBJl17GoX96zx1d1XtH5XvK6/AEAnmYZl+rXMElc3VwVkMMcsz/glu4aDFvT8ezuiB+R743OmFwe8L8YN9b6GuanjL4z01JjAAYAcDTLjyFEoG13vmCW6dBgXwCgyKSCCmHYaAsrgysA+jzKqMhyHoN7n7omFMGF7kgc+dXhh8doCjFt1Efdc9tN/PS2BIZgV8jL/8RMpG9vMEDJ0KBfAWDLYZ0DqHT1lcGtib8WbXjIfB7zO5/fwh7DmmxAOfO70w2JaPI+ZfS78ek9F9a3iBIZnpsxn34x/RZdxg7TB0OhTAOzCEA7naYbCVyYWB6Uwx9W6UvQCDbRncdNYgZk0o0zpHMr0wmKbNoXOvYHD9Xq6v3S6BAQDDshhz/jFUTR6udw6tq+/GvASDzwpqncNSBucGprK31VPrHF6AwbIMrl02kIXTKrTOkUwzDIbFQbMuYVi/2a6v3S6BAQDDMhl19lHU7DVG3wzaVnYhr8AQ8ufgs0Ja5zCVwQr/ZOZYvbXO4QUYTFNxxWn9OWCfSq1zJNMLg2GY7D/jAkYPXOj62u0SGAAwTIORyw+n2+wJetbXsqqLeQeGbPx2WOschlIs9U9gka339fACDIahuOTEvhw+r1rrHMk0w6AMFu15NuOGHuj62u0SGABQhsGw0w6mx8Kprq+t9/4MLjWnXz8AfvqXv2qbQSlF0JcFKLbt2Kx1jpN8Y/FjcseOP2mbY9mSJApnXf+OthmUUpx7bG/8PhP4jbY5kjk4H/+d5pfvxRp5gOurK6WYN2UptuWj4SvXl2+bA1s3J2EYOKpey8VdoeMWANBwxf2ur92aUorBJyzG9Nm8cdfPXVs3I1CAnTC88sGHZAf1HONPwhBFAdubG7Xdj0YpxbG+UfiweL75X8SUnkNbrTA8+usvKIzpOYVXKcWyI3rypzu7Y23/J1lhG0PnBQ3+iLallVLMnHASzz73ANsbtrQ84lPfwQSf39Z6tW8rDNuffhkVz9Eyg1KKAccswPTbfPT8HwnkZu3+NR3HcXb7KpIkSVKHqNP/piBJkiR98wQFSZIkKZWgIEmSJKUSFCRJkqRUgoIkSZKUSlCQJEmSUgkKkiRJUipBQZIkSUolKEiSJEmpBAVJkiQplaAgSZIkpRIUJEmSpFSCgiRJkpRKUJAkSZJSCQqSJElSKkFBkiRJSiUoSJIkSakEBUmSJCmVoCBJkiSlEhQkSZKkVIKCJEmSlEpQkCRJklIJCpIkSVIqQUGSJElKJShIkiRJqf4f2TPVdS9mXOIAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import random\n",
    "\n",
    "def generate_random_triangles(grid_size=10, triangle_size=1):\n",
    "    \"\"\"\n",
    "    生成随机右三角形网格图形\n",
    "    :param grid_size: 网格的大小，表示网格的行列数\n",
    "    :param triangle_size: 三角形单元的边长\n",
    "    \"\"\"\n",
    "    fig, ax = plt.subplots()\n",
    "    ax.set_aspect('equal')\n",
    "\n",
    "    # 遍历网格的每个单元\n",
    "    for row in range(grid_size):\n",
    "        for col in range(grid_size):\n",
    "            x0 = col * triangle_size\n",
    "            y0 = row * triangle_size\n",
    "            \n",
    "            # 随机选择右三角形的方向\n",
    "            direction = random.choice(['lower', 'upper'])\n",
    "\n",
    "            if direction == 'lower':\n",
    "                # 绘制右下三角形\n",
    "                triangle = [(x0, y0), (x0 + triangle_size, y0), (x0, y0 + triangle_size)]\n",
    "            else:\n",
    "                # 绘制右上三角形\n",
    "                triangle = [(x0 + triangle_size, y0), (x0 + triangle_size, y0 + triangle_size), (x0, y0 + triangle_size)]\n",
    "            \n",
    "            # 生成随机颜色\n",
    "            color = np.random.rand(3)\n",
    "            \n",
    "            # 绘制三角形\n",
    "            ax.fill(*zip(*triangle), color=color)\n",
    "    \n",
    "    # 隐藏坐标轴\n",
    "    ax.axis('off')\n",
    "    plt.show()\n",
    "\n",
    "# 调用函数生成随机三角形图案\n",
    "generate_random_triangles(grid_size=10, triangle_size=1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQ4AAAGFCAYAAAAMxh2+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAmn0lEQVR4nO3deXRU150n8O+rvbRLJQmVkB0JCTC2WAzCIJHCCLylJ0u3mplpi+5pu730sdMTkzmTdE4nYXpIcnqczImhk+BsTnecdJxM1Mok0zPHyR+OoDDEIDDCBVoQCBCiAKm0lJZSlVRV88erEggtVqF336tX+n7+4VgU7/18QD/d+7v3d68UjUajICJKgEHrAIhIf5g4iChhTBxElDAmDiJKGBMHESWMiYOIEsbEQUQJY+IgooQxcRBRwpg4iChhTBxElDAmDiJKGBMHESWMiYOIEsbEQUQJY+IgooQxcRBRwpg4iChhTBxElDAmDiJKmEnJh4XDYbjdbni9XjidTrhcLhiNRiVfQURJQLHE0djYiFdeeQXXrl2b+lpJSQkOHjyIuro6pV5DRElAUuJ6hMbGRuzevRt3P0qSJABAQ0MDkwdRCll04giHwygtLZ020pj2AklCSUkJurq6OG0hShGLLo663e45kwYARKNRdHd3w+12L/ZVRJQkFp04vF6vop8jouS36MThdDoX9Lk8m2WxryKiJLHoxOFyuVBSUjJVCJ1NvsWIye/sx7l//BrGeq4u9pVEpDFFV1UAzFhZAYB9G1fhkXQDwuNjMGdmo+Rjf4Ky//AMMu4vW+yriUgDiiQOYPZ9HAU2C16qLIPL6QAARCMRTAwPYTIwClNaBoof/zhW/MdnkVXxgBIhEJFKFEscgLw0u7N6C46cPIWP31+Iv1lXDuMsU5hoNConkLFRmOxpKHr0Cax4+jnkrFmrVChEJJCivSpGoxGFDnl0UZxmnTVpAPLeDktWDuzLiiEZDLj29q/w7l//ezR/4SX0tzTPOt0houShaK8KcHu36EK+9SVJgjkzG6aMLEyOjuD6O/8PN999B/mbt6H86efgqKqZt+hKRNoQlzgSGDVIkgRzRiZM6RkIB0Zx69130HviKBzrq1C+50UUbN0OycBGXqJkoXjiwCJGCJIkwZSWAaM9HeHxAPqaj8H3/gnkVj6MFfXPo8j1GCRuWyfSnOKJw5DAVGUukiTBZE+DyZ6GyfEx9Lc0Y+CD08ha/RDK65+Hs/ZjMJjNygRMRAlTfPx/e6qizPNMtjTYlxXDnJWDobYPcHrfXhx55hPo/r8NCAeDyryEiBKifOFAUC3TaLXBXlgMS04ehi+248xXPofDf/FHuPKrn2EyMCbmpUQ0K2EjDlGMFivshcWw5uRjtLsLZ1/9Ig7veQpdv/hnTIwMC303EckETlXE7sUwWCywFzhhzS1AwNsDzzf/Hk31T6LzJ99DaGhA6LuJljpxiUPpB8/BYDbDVlAEq2MZgr5etH77H9D09JPoeOMfEezvUykKoqVF+cSBeOJQd/enwWSCzVEIW34RJvyDaPveN9FU/yTavvs/EbjFs0CIlKR84tB4o5ZkNMKaVwB7QREmR0fQ8aNv4XD9U2zpJ1JQ0i/H3nMcRiOsufmwFxYjHArh4k+/j8P/6d/hg2/sw8iVS9oGR6RzKZs44iSDAdacPNgLixGdDKPrlz/Gkb/8BM587W/h72zTOjwiXdLdcuy9kgwGWLJzYV+2HABw9dc/x9Hn/gSn9+3FYOtZjaMj0hdhTW4RlYujCxVv6TdnZmNyZBjX3v4VvE1vo7B6B8rrn0PuuqqkTX5EyUJY4kh2ckt/FkwZmZgcHYH392/j1rHfI7+qBiuefg75m7fp5v+FSG3KJw5DctU4PszdLf03Yy39ees3o3zPCyisflTzlSKiZKN84oiVTdTex7FYd7f0+04dQ/+ZE8h5aAPK659H0fbH2dJPFKPpCWDJ6O6W/oGzp3DK8z6yVj2I8j0vsKWfCEI2gKVOXWBaS3+7R27p/8uPs6Wfljxxy7F6HXLMYlpL/6ULUy39lxv/hS39tCQJq/rprcaxEHJLvxPWXLml/4NXv4TD9U/h0i/+iS39tKTovjtWCwZzrKXfUYDAjes4983/jqann0Dnm99lSz8tCYonDoMUe2QqZ44Yg8kMW8EyuaW/vw/nv/0/5Jb+Hx5E0NerdXhEwggYcci/LoG8MSXe0m8viLX0f/81uaX/9W8gcPO61uERKU75GodBn/s4lDCtpX9sDB3/9G0c3vMxnDvIln5KLSnfHasFuaXfAXthMSKhEC7+i9zSf/brX8bI5Ytah0e0aAJqHKmzj2OxJIMBljta+i83vIkjz3wSZ776efgvtGodHtE9EzDiiE1VlvKQ4y4zWvp/879w9Pk6uaX/fIvG0RElTsCWc/lXpo2Z5mzp3/ooyvc8z5Z+0g0BiYOdpB9mRkt/09u4dbwJjk3VKK9/ni39lPTEtdUr/eAUdHdL/61jTeg7+S7y1lehfM+LbOmnpCWuO5aZY8HubunvO3Uc/WdOIueh9Sivf4Et/ZR0xBVHOeZIWLylP23ZcpgzsjDwwWk0/92n4f6rP0bPb3+NSCikdYhEANirkrSMNrvckZuVg6E2D07/t8/iyDOfQPe//ZIt/aQ5nseR5IxWG+zL7mjp/+rn2dJPmhNXeeOQQ1EzW/q/iMP1T+LSz3+EiWG/1uHREsOpis7cbukvROCmF+de24+m+ifZ0k+qEpg4mDpEMpjMsOUvgymvEM1dV/Hd/V/Gwce3ovX7r7Gln4RTfDnWMLXlXOkn093cXh8OebrQNx5bbbnYh1dbPoeXDn0L9S++hNI/3QP7smJtg6SUtGSugEw1bq8P+5vbbyeNGF8ojK+2dOHNb35dbuk/8FW29JPiWOPQoXA0ikOernk/80aPHxPBIC7+7Ac4/Bds6SdlCVuOZY1DHI/PP2Okcbfe8RA6wia5pT8cb+n/BM585XNs6adFE7ZzlHlDHF9wYTtIfcHQXS39Blz9P3JL/6kvf4Yt/XTP2OSmQw6rJeHPyS392TBnZmFyZBg9v/01bhz+HVv66Z6wyU2HKh1ZyLdZ5p2uFNgsqHRkzfj6tJb+sRF4m36LW8d+L7f073mBLf20INzHoUNGScLLlWXzfualyjIY50kAkiTBnJ4J+7JiGG123PrDYbz32Wdx/NP1uHn0HUQjEaXDphQirsZBQrmcDuyrWo182/RpS4HNgn1Vq+FyOhb0nHhLf9qy5TClZaDv1HGc/PyLePfF3fD+/m1Ew2ER4ZPO8bZ6HXM5HagpyoPH54cvGILDKk9P5htpzMdkT4PJnobweAADnvfR/HefRvbKNVhR/zyKd/4RDJaF1VYo9QkojnLnqJqMkoT1+dnKPtNmh91mRzg4jqGOc3j/7/8LOt98HSuefg7Ln/gkjFabou8j/RG4c5SZQ++MVpt8Jkispb/la3+Lw3/Oln4SkTiUfiBpblpL/7UrbOkn3uRGCye39BdNtfR7plr6X0dosF/r8EhFAracx88cpVQVb+m3OZYh2N+H8995FU1PP4mOHx7EeN8trcMjFbDJje6ZwWSCzVEIe34RJob9aPv+azi85ymc/86rCNy8rnV4JJDAEQdTx1IhGY2w5uXDXliEybExdP74dRyufwqe176C0Z4rWodHAohbVWHeWHIkgxHWXAfshU5EJiZw6a0f4kispX+4q1Pr8EhBnKqQ4iSDAZacvFhLfwSXG96E+9lPsqU/hbA4SsLM2dL/pc9g4NwZrcOjRRBw5iiXY2m6GS39v/s1bhyRW/pX1D+HvPWb2ZGrMwJvq2fmoOnY0p86BCQO+VemDZpLvKXflJaBcGAMt44fRl/zMeSt24Ty+hdQuK12aspLyUlck5vSD6aUI7f0p8OUlo7JwBj6Tv8B/S3NyF6zFhV7XsSy7Y/DYFL8nygpgGeOUlIw2dOQtmw5zBlZGDx3Bs1f/Bsc/as/xrW3/zcioYWdsUrq4SnnlFSMNrvckZuVM9XSf+SZT+Dqb36BcHBc6/AoRtiIg2mDFmNmS/8XcHjPx3D5X3+KybFRrcNb8rhzlJLaVEt/Xj5Ge67ig69/GYf3PIVLb73Bln4NsXRNunC7pb8AgZtenDvwFTTVP4kLPz7Eln4NKJ44DLxXhQSKt/RbYy39rYe+jqann0T7Dw+wpV9FAmscTB0kzt0t/e3fP8CWfhXxBDDStZkt/YfQVP8UPN/cj9FrbOkXRViTG5Gabrf0FyM6MYFLP39Dbul/9Uts6ReAbfWUUqa19EciuPyvP4H72U/i/f3/FUMd57UOL2UwcVBKurOlX5IM6P63X+Ld5/9Ubun3vK91eLrHC5kopckdudkwZWRhcnQYPb/7DW4c/h0Ktm5Hef1zyNvwCDty74Hy53EY2FZPyUeSJJgzsmBKl1v6bxz+HXqPN8GxcSvK//xFtvQniHfH0j0JR6OK3Vmrphkt/e8dQd+p48hbtwkr6p/Hsm07WeBfAHGJg5kjZbm9PhzydKFv/HbXar7Ngpcry+ByOjSMbOHmbOl/oBLle15E0aNPsKV/HjxzlOYUjkbR0jeEd3p60dI3hHA0CrfXh/3N7dOSBgD0jYewv7kdbq9Po2jv3fSW/hac+tJ/Zkv/h2CNg2Y126jCYTVjIjL/3+vrni7UFOXpYtpyN6PNDrvNjnBwPNbS/1l0/vgQVjz9HJY/+SkYrTatQ0waXI6lGeYaVfiCE/BPTM77Z3vHQ/D49N21erul34Hhrs7bLf0NP2FLfwy3nNM04WgUhzxdi3qGL5gaw/sZLf3f2Iem+ifZ0g+21dNdPD7/jJFGohxWi0LRJIc7W/rHb92QW/qffmLelv5wOIympia89dZbaGpqQjgcVjlqscQd5EO6tNjRQoFNXppNRdNa+gd8aD30dfz+z55A+w9em9bS39jYiNLSUtTW1qK+vh61tbUoLS1FY2OjhtEri/s4aJrFjhZeqizTZWE0EfGW/mg4jNDQANp/cBBdv3wT93/qz9Biy8OeF/4a0bvm6j09Pdi9ezcaGhpQV1enUeTKEVjjYOrQo0pHFvJt8yePLLNpxmcKbBbsq1qtm30cSrjd0u9EOBBA+z9/B5/59Kdn/bcf/9revXtTYtoibMRB+mSUJLxcWYb9ze1zfmbv+nLUFOXpcueoCJLBAGuuA629BvQFJ+b8XDQaRXd3N9xuN3bs2KFegAJwqkIzuJwO7KtaPWMfR4HNgpfu2B26Pj9bqxCTUn9o/qXqOK/XKzgS8Zg4aFYup4OjigQttD7kdDoFRyIeEwfNyShJHFUkIF4fmms5W5IklJSUwOVyqRyZ8gTeq8LUQUtLvD40nwMHDsBoNKoUkTjcck6koHh96O5VJ6fTmTJLsQCnKkSKu7M+9OrpdvQGJ/Htb30rZZIGwCsgiYSI14c25GUCAJqPujWOSFmcqhAJtDJXThynTryncSTKYuIgEmhljty3c7a1TeNIlCUwcTB1EK3ITocE4MbAIHp7e7UORzHi2uqZN4iQZjKi2GYGAJw+fVrjaJTDtnoiwSqy0gAAJ44e0TgS5bDGQSRYRbxAevy4xpEoh4mDSLCVOXLiOOM5p3EkyuGZo0SCrczJAABcuXkLfn9qnFUqsMbBzEEEAFkWM/It8ibtM2fOaBuMQjhVIVJBRZYdAHDy2LsaR6IMJg4iFazMluscJ1Nk6zl7VYhUUBHrWTnzgUfjSJTBEQeRClZmywXSzmvXEAgENI5m8Zg4iFSQb7Mg22RAOBKFx6P/UQdXVYhUIEkSyjPlAmnze3/QOJrF4z4OIpVUxPZznDhyWONIFo9TFSKVrMyVW+xTYS8HEweRSuI7SFu7rmBycmF3sCQr3lZPpBJnmg12g4Tg5CTa2vR9sA/b6olUYphWINX3UYIsjhKpqCI7HQBwUudnc/DoQCIVVcQKpKeamzWOZHFYHCVS0apYgfRc50VEIhGNo7l3rHEQqei+DDvMEjAyHsSlS5e0DueescZBpCKTwYCydBsAfU9XOFUhUll5vEDq1u8OUk5ViFQ2dbvbyZMaR3LvuKpCpLL44cVn29oR1emcnjUOIpWVZaXBAKB/eATXr1/XOpx7wqkKkcqsRiPuS7MAAE6fOqVxNPeGxVEiDVRkyQXSEzotkDJxEGmgIlbnOKXTnhVOVYg0EF9ZaTnfqnEk90ZgcZRjDqK5xJvdrvv64fP5NI4mcTyPg0gD6WYTnDYzAOD06dMaR5M41jiINFKemQYAOPnuUY0jSRwTB5FG4kcJNuvwWkgWR4k0Ej+8uOXcOY0jSRx3jhJppCJHLpB2eW9gZGRE42gSw6kKkUZyrRY4LEZEo0BLS4vW4SSEUxUiDcULpM3Hj2kcSWLYHUukoXiB9MRRt8aRJIY1DiINxQ8vPnP2rMaRJIZTFSINrcqWRxwdV7oRDAY1jmbhWBwl0lCB3YJMkwGTkQjO6WhZlomDSEOSJGFFhny728k//EHjaBaOiYNIYytz9He7m7gaBzMH0YKszM0GALyvo2Y3jjiINBZfkm3tuoxwOKxxNAsjrK2e+ziIpgtHo2jpG8I7Pb1o6RtCOLZnYXm6DTaDhEBoAh0dHRpHuTAmpR/I5ViimdxeHw55utA3Hpr6Wr7Ngpcry+ByOrAiw4bz/gCaT5zAmjVrNIx0YbiPg0gwt9eH/c3t05IGAPSNh7C/uR1ur2/qRDC9HF7MGgeRQOFoFIc8XfN+5nVPF8pz5B2kp3Vynyy3nBMJ5PH5Z4w07tY7HgJiA3VPR6cuzuvlVIVIIF9w/qQRZzYYYJIAfyCAy5cviw1KAZyqEAnksFoW9LlCuxUfSbcC0MftbkwcRAJVOrKQb5s/eRTYLKh0ZGFl7Ha39w43qRDZ4nCqQiSQUZLwcmXZvJ95qbIMRkmaarE/ffKEGqEtitDEoYciD5FoLqcD+6pWzxh5FNgs2Fe1Gi6nAwCwMnYt5Nm2dtVjTJTQDWBRTBWLiZY0l9OBmqI8eHx++IIhOKzy9MR4x/dLWVYaDAB6h/zwer1wOp3aBfwhxI44lH44kY4ZJQnr87Oxc3kB1udnT0saAGA3GbHcLo9Kkv12N7E1DmYOooRUZMVud0vyFnvBIw5mDqJEVMRusT+V5If6cKpClERWxQ8vPnde40jmJ/S2ei6qECWmPLaX41pvHwYGBjSOZm7cx0GURDItJiyzyoudZ86c0TaYeTBxECWZ8niB9N2jGkcyNxZHiZJM/CjBpZs4mDeIErYydjZHi8ejcSRz46oKUZKpiI04LvZ4MTY2pnE0s2ONgyjJOGwW5JqNiESjOJukd8pyxEGUhMozY7e7HXtX40hmx+5YoiRUkeQFUk5ViJLQytgO0veTdC8HpypESSi+JNt+pRsTExMaRzMTl2OJklCR3Yp0owET4TDOn0++vhVuACNKQpIkoTzTBgBofi/5OmVZ4yBKUhXZ8nTlxJHkO5uDUxWiJBUvkJ5+P/lOA2NxlChJxQuk5zovIRKJaBzNdELP4yCie1eSYYfFICEQCuHChQtahzMNi6NEScooSViRLhdIT508qXE003HEQZTEyrPlszlOHDmscSTTCUkc8UEHi6NEi7MqNxsAcPpUs8aRTCcmcYD3xxIpId6zcra9I6l6vwSNOJg4iJRQmpkGowQMjY6hu7tb63CmCBpxxCRRhiTSI4vRgPvTrACA06dOaRzNbWKKoxxxECkmfrvbe0eatA3kDkJHHEwcRIs3tYP0xAmNI7lNaI2DmYNo8VbGroVsaW3TOJLbxC7HMnMQLVp5VjokADcHBnHr1i2twwHA5ViipGc3GbHcbgYAnD6dHA1vgkccRKSE8sz47W5ujSORCdpyzsxBpKR4naP52DGNI5FxxEGkAxU5sQLpueQ4RlBokxuLo0TKiJ/NceXmLQwNDWkcjejlWCJSRJbFjAKLCQDQ0tKicTSiN4BxwEGkmPIs+Xa3E0lwSRNHHEQ6sTI7ViBN2cTBfRxEiqvIkxPHmQ8+0DgS4Qf5MHUQKWVV7LqEzms9CAQCmsbC7lginXDYLMg2GRCOROHxeDSNRex5HESkGEmSUBHfQXr8uKax8AQwIh0pj+3nOHlU29vdxCYO1jiIFLUqdjaH+9hxvPXWW2hqakI4HFY9Dk5ViHRkMDQBALjYcx319fWora1FaWkpGhsbVY2DUxUinXB7ffi2p2vG13t6erB7925Vk4fgqYqIpxMtPeFoFIdmSRrA7ZLA3r17VZu2CG5yIyIleHx+9I2H5vz9aDSK7u5uuN3qnNcheMs5UweREnzBuZPGnbxer+BIZGJHHMwbRIpwWC0L+pzT6RQciYxNbkQ6UOnIQr5t7uQhSRLuu+8+uFwuVeLhvSpEOmCUJLxcWTbr78V/UB84cABGo1GVeLgcS6QTLqcD+6pWzxh5lJSUoKGhAXV1darFIrQ7lqmDSFkupwM/fWwTyjNsAIAvfP7z6OrqUjVpANzHQaQ7RknCyth9ssbJCdWmJ3fiQT5EOuRMl48RvNCuzbWQPI+DSIecsfb6rsuz7yYVTWyNg5mDSIjidLnGcaVHnQ1fdxM8VWHmIBLBmSYnjluDQ5ocI8jlWCIdyjSbkGaUv8+uXLmi+vs5VSHSIUmSUBTbz3Hx4kXV388RB5FOFaVZAQCdrerfJ8saB5FOxescF86dU/3d3ABGpFPFGfKSbGfnBdXfLXjLORGJ4syQN4FdvnpV9XfzBDAinYpPVa7euKX6jQI8j4NIp5alWSEBCIRC6O3tVfXd7FUh0imzwYB8iwkAcOnSJVXfLbZXhdVRIqGK7PJejs4L6hZIWRwl0rH4Xo4LnrOqvpcbwIh0rDi2stKpcns993EQ6Zgztpfj0iV12+sFjziYOYhEih/oc6Xnuqrv5aXTRDrmjNU4bgwMIBgMqvZeTlWIdCzHYobNICEaVbe9nsVRIh2T2+vNANTdy8G7Y4l0bmpJ9rx6XbIccRDpXLxnpUP3iSP2K2scROLF2+svqbh7lCMOIp2LL8l2qdheL7StnojEc6bH2+tvqtYfJrTJjYjEK4rVOEbHg/D5fKq8U0jiMLA7lkg1FqMBDot8f6xaS7K8ApIoBUxdldDZqcr7hLbVM3EQqSNe5+hQqb1e7AYwZg4iVTjT5JWVi23qtNfzXhWiFBC/vf5Slzrt9dzHQZQCpm6vv9ajyvt4yjlRCohvO7/u68fExITw97GtnigF5FrNsBgkRKJRXFVhBymnKkQpQO32eh4dSBQTjkbR0jeEd3p60dI3hLDOhsxOe6y9vrVV+LtMIh7K5VjSG7fXh0OeLvSNh6a+lm+z4OXKMricDg0jW7iiNBvgG8aFcx7h7xI64ojoLGPT0uT2+rC/uX1a0gCAvvEQ9je3w+1Vp/9jseKXUF+80CH8XWLP4xDxcCIFhaNRHPLMv/fhdU+XLqYt8cTRpcLZo2yrpyXN4/PPGGncrXc8BI/Pr1JE9644di7HVe9N4e/iqgotab7g/Ekj0c9pqShWHPUHAhgYGBD6Lm4AoyXNYbUo+jkt2UxG5JrVaa8XvAGMYw5KbpWOLOTb5k8KBTYLKh1ZKkW0OPHb60W31wvujmXioORmlCS8XFk272deqiyDUSej6PjNbh2eD4S+hzUOWvJcTgf2Va2eMfIosFmwr2q1bvZxALcPLu5sE7sJTOgGMCYO0guX04Gaojx4fH74giE4rPL0RC8jjbjbt9eLrXGITRzMHKQjRknC+vxsrcNYlPiS7OVr14S+h6sqRCkkXuO43ufD5OSksPewyY0oheTZLDBLEsKRKLq7u4W9h6ecE6UQgyRhmQrt9bxXhSjFOGN7OS4IPLiYNQ6iFFMUO3/0wjlxezl4dCBRiilOl5dkL3aIa6/nBjCiFKNGe73YtnoOOYhUN3VVgveGsHdwxEGUYuK31w+NjmFoaEjIO1gcJUoxdpMRObH2+i5BN7sJ3sfBMQeRFuJXJYhqrxe7j0PEw4noQy2LTVc6BJ14zuVYohTkjBVIO1vPC3k+EwdRCiqOt9dfvCjk+UJrHESkDdHt9YJrHBxyEGkhfnv9tV4fwuGw4s/nPg6iFOSwW2CSgMlwGD09PYo/n6ecE6UgoySh0CquvZ41DqIUFb8q4Wc//QmampoUnbJwHwdRCnJ7fTg/FAAA/OCNH6G2thalpaVobGxU5PlcjiVKMW6vD/ub2zEeiUz7ek9PD3bv3q1I8hCTOAycqhBpIRyN4pBn9v6UeM1x7969i562sDhKlEI8Pj/6xue+IDsalQ8xdrvdi3qPkHtV4pg2iMQLTIbRMTiCtv4huK/7FvRnvF7vot4p9EImIlLWZCSCy8NjaO33o83nR/vQCLrHQoh8+B+dxul0LioOMYkD3DlKtFjRaBTesSDa+v1o6x9C2+AILg6PIzRLCcCZl4tN69Ziy0ddOPjd76Gvr2/WZ0qShJKSErhcrkXFJiZxGMSeSEiUigaDE2gbGJaTxMAwOvxjGJ6cOZbIstvx8INr8EhNNbbtfAyPbNkybQTx4MMbsXv3bgDT64zxmcCBAwdgNBoXFSvvjiXSQGAyjM6hUbT2D6Gt34/2oVHcCs68stFsNKKyYgU2b96Mbbsex9aaGlRUVMAwzw/nuro6NDQ04JVXXsG1O5rcSkpKcODAAdTV1S06fiYOIsHCkSguD4+hbcCPNt8Q2gZHcXUsOKMuIUlAeXExqjY+jJodtaje/ijWrVsHi8WS8Dvr6urwqU99Cm63G16vF06nEy6Xa9EjjTgWR4kUFI1GcSMQlKccfYNoHxzBhZFxhCIzf4oW5eZg07q12OrajuodtaiqqkJ2drZisRiNRuzYsUOx591JaOKIsDhKKW4oOIG2wWG0+/xoG/Cj3T8G/yx1iQybDQ8/+AC2VNdg2y65LlFcXKxBxMrgiINogcYnw+j0j6LNJ69ytA+N4UZwYsbnzEYjHlpRis2bH8G2XY9h67ZtWLly5bx1Cb0RtKrCGgfpWzgaxdXhMbT2y6sc7YMjuDw6sy4BAOXFTlQ9vAE1tbtQvX071q1bB6vVqnrMahK0j0POrNzHQXoQjUZxKxBE28AIWn1yXaJzOIDxWeoShdlZU3WJmtqdqKqqQk5OjvpBa0zsqoqIhxMtkj80gfaBkWn7JQYnZjZ9pdus2PDAamyprsa2XY9jy9atWL58uQYRJx+hUxUirQXDYVwcGpu2X8I7PrMuYTIa8GBZqbxfYqdcl1i9enVK1SWUxH0clDLC0Si6RwJo6/ej1TeE9iG5LhGe5d9hmXMZqjZsQHXtTtRsfxTr16+HzWZTP2idEjxVYeYgMaLRKHrHQ/J+CZ885egcDiAwS10iPysTm9ZWYqvLhZraXdi8eTNyc3M1iDp1CG2rZ94gpQyHJtE+GFvh6B9Gu38MA7PUJdKsFqxfvQpbtlZj22NyXaKkpIRbBBQmJHEYpPiqClHiQuEILvpH5eJlvx/tg6Poma0uYTDggdL7Y3WJXdi67aN44IEHFNtWTXMTNFUR8VRKRZF4XSI25WgfHEHX6DgmZ/mp85FlhajasB7VO2pR8+gObNiwAXa7Xf2gSdBUxcB9HDS7vkAQrbHW8faBYXT4Z69L5GVmyHWJbdtQs/MxbN68GQ6HQ4OIaTZcVSFhRicm0T44Eite+tE+NIb+WeoSdosZ61atxJat1ajZ9Ri2Vlfj/vvvZ10iiQmqcfAvfKkJhSPoGpb7OFpj+yWuBWYemms0SFj9kfuxedMm1Ox8DNUf/SjWrFkDk0lsnZ6UJWjEEZuqcMiRkiLRKHpGx+X9ErE+jksjs9cl7ivMR9X623WJhx9+GGlpaeoHTYoSWhxl2kgNvvh+if4htPUP48JwAKPhme1euRnp2Fj50FRd4pFHHkF+fr4GEZNoQkccpD+jE5Oxo/bl8yU6hsbQF5p5pJ3NbMbaVRXYsmULanY+hq01NSgtLWVdYokQ21Yv4uGkmIlIBF3+salTtNuHRtE9Fprx92aQJKy6/z5s3rRxqi7x0EMPsS6xhHFVZYmIxusSU/slhnFxZBwTs/wdleQ7sGnDelRvfxQ1O2qxceNGpKenqx80JS2xxVERD6cF6R8PoW0wliRi+yVGZqlLZKenYeNDD2JrzTbU7NyFR7ZsQWFhoQYRk56wyS0F3HkFoNw6PobeWeoSVrMJlRXl0+oSK1asYF2CEsbzOHRmoVcAShKwqqQEVZs2ykfauVyorKyE2WzWJG5KLaxxJLFErgAsduTJR9ptfxTbandi48aNyMzM1CBqWgoE31bPzJGIgWBoxpF2s14BmCZfAbilZhu2xeoSRUVFGkRMSxVHHBpZ6BWAFpMJleVl2PzIFvmo/dgVgKxLkJaEnsdBsnAkiq7YFYDtH3IFYMXyYlRt3Iia2p2odm3H2rVr7+kKQCKReCGTwu6+ArBtcASdc10BmJeDTWvlukRN7ArArKwsDaImSgyvR1ikhV4BmGm3YcOa1LkCkJY2wVvOUyt1jM9Sl7g5S13CbDTiofIy+Ui7XY9ja01Nyl0BSEub2CY3HeeNcCSKKyNjaOsfnmodvzLfFYAbH0bNjp1L5gpAWtrY5Aa5LnEzXpeIH7U/Mo7gbFcA5mRh09q1qN6+HdU7dmLz5s3Izs7WIGoi7SzJ5Vh/aCKWJPyx/RKjGJqlLnH7CkC5LsErAIlkKd+rEgzH6hI+P9oHeAUgkRJS6iCfcDSKq8Nj047avzw2/xWANbU7Uc0rAIkSotvl2Gg0it5AKHbU/iDaB0ZwYTiAcV4BSCScoOJo/LBi5Z45HJqU90vEzr1s949hkFcAEmlCTJNbLGPcCATR0jeESkcWjAl844bCEXTedQXgdV4BSJQ0pKjCdxg0Njbi2Wefhd/vn/pavs2ClyvL4HLOvIlr6grAqaP2R9E1Oj5rXYJXABIlB0UTR2NjI3bv3j3nfSpf3rQKa3Izb++XGBzGhTmuAHRkZmDj2kps3fZR1OzcxSsAiZKIYokjHA6jtLQU165dm/MzBmDWnZe8ApBIXxSrcbjd7nmTBiAnDYMkyXUJXgFIpFuKfbd6vd4Ffe6NH/0IzzzzjFKvJSINKLZTy+l0LuhzpaWlSr2SiDSieI2jp6dn1uKoJEkoKSlBV1cXl0uJdE6xEYfRaMTBgwcBzDwBLP7fBw4cYNIgSgGKNpXU1dWhoaFhRgdpSUkJGhoaUFdXp+TriEgjim8AA+Rpi9vthtfrhdPphMvl4kiDKIUISRxElNp42AQRJYyJg4gSxsRBRAlj4iCihDFxEFHCmDiIKGFMHESUMCYOIkoYEwcRJYyJg4gSxsRBRAlj4iCihDFxEFHCmDiIKGFMHESUMCYOIkoYEwcRJYyJg4gSxsRBRAlj4iCihP1/NZ5lS9kK/L8AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from scipy.spatial import ConvexHull\n",
    "\n",
    "def generate_random_polygon(num_points=10):\n",
    "    \"\"\"\n",
    "    随机生成一个多边形\n",
    "    :param num_points: 多边形的顶点数\n",
    "    \"\"\"\n",
    "    # 随机生成点坐标\n",
    "    points = np.random.rand(num_points, 2)  # 在 [0, 1] 范围内生成点\n",
    "    \n",
    "    # 使用凸包算法生成一个封闭多边形\n",
    "    hull = ConvexHull(points)\n",
    "    polygon_points = points[hull.vertices]\n",
    "\n",
    "    # 生成随机颜色\n",
    "    color = np.random.rand(3)\n",
    "    \n",
    "    # 绘制多边形\n",
    "    plt.fill(polygon_points[:, 0], polygon_points[:, 1], color=color, alpha=0.8)\n",
    "    \n",
    "    # 绘制顶点和轮廓\n",
    "    plt.plot(polygon_points[:, 0], polygon_points[:, 1], 'k-', lw=1.5)  # 轮廓线\n",
    "    plt.scatter(points[:, 0], points[:, 1], color='black')  # 所有随机点\n",
    "    \n",
    "    # 设置图形显示\n",
    "    plt.gca().set_aspect('equal')\n",
    "    plt.axis('off')\n",
    "    plt.show()\n",
    "\n",
    "# 调用函数生成随机多边形\n",
    "generate_random_polygon(num_points=10)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from scipy.spatial import ConvexHull\n",
    "\n",
    "def generate_polygon_with_fixed_edge(fixed_edge, num_points=8):\n",
    "    \"\"\"\n",
    "    随机生成一个包含固定边的多边形\n",
    "    :param fixed_edge: 固定边的两个顶点，例如 [(x1, y1), (x2, y2)]\n",
    "    :param num_points: 除固定边外的随机顶点数量\n",
    "    \"\"\"\n",
    "    # 转换固定边为 NumPy 数组\n",
    "    fixed_edge = np.array(fixed_edge)\n",
    "    \n",
    "    # 随机生成其他点\n",
    "    random_points = np.random.rand(num_points, 2)  # 随机生成点\n",
    "    all_points = np.vstack([fixed_edge, random_points])  # 合并固定边和随机点\n",
    "    \n",
    "    # 使用凸包算法生成多边形\n",
    "    hull = ConvexHull(all_points)\n",
    "    polygon_points = all_points[hull.vertices]\n",
    "\n",
    "    # 生成随机颜色\n",
    "    color = np.random.rand(3)\n",
    "    \n",
    "    # 绘制多边形\n",
    "    plt.fill(polygon_points[:, 0], polygon_points[:, 1], color=color, alpha=0.8)\n",
    "    \n",
    "    # 绘制固定边\n",
    "    plt.plot(fixed_edge[:, 0], fixed_edge[:, 1], 'r-', lw=2, label='Fixed Edge')  # 固定边用红色表示\n",
    "    \n",
    "    # 绘制顶点和轮廓\n",
    "    plt.plot(polygon_points[:, 0], polygon_points[:, 1], 'k-', lw=1.5, label='Polygon Edges')  # 多边形轮廓\n",
    "    plt.scatter(all_points[:, 0], all_points[:, 1], color='black')  # 所有顶点\n",
    "    \n",
    "    # 设置图形显示\n",
    "    plt.gca().set_aspect('equal')\n",
    "    plt.axis('off')\n",
    "    plt.legend()\n",
    "    plt.show()\n",
    "\n",
    "# 固定一条边的两个点\n",
    "fixed_edge = [(0.2, 0.2), (0.8, 0.2)]\n",
    "\n",
    "# 调用函数生成包含固定边的多边形\n",
    "generate_polygon_with_fixed_edge(fixed_edge=fixed_edge, num_points=10)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "def generate_polygon_with_fixed_edge(fixed_edge, num_points=8):\n",
    "    \"\"\"\n",
    "    随机生成一个多边形，其中一条边固定，其他边随机\n",
    "    :param fixed_edge: 固定边的两个顶点，例如 [(x1, y1), (x2, y2)]\n",
    "    :param num_points: 除固定边外的随机顶点数量\n",
    "    \"\"\"\n",
    "    # 转换固定边为 NumPy 数组\n",
    "    fixed_edge = np.array(fixed_edge)\n",
    "    p1, p2 = fixed_edge[0], fixed_edge[1]\n",
    "    \n",
    "    # 随机生成其余点\n",
    "    random_points = np.random.rand(num_points, 2)\n",
    "    \n",
    "    # 合并所有点（包括固定边的两个点）\n",
    "    all_points = np.vstack([fixed_edge, random_points])\n",
    "    \n",
    "    # 计算角度，用于对点进行排序\n",
    "    center = (p1 + p2) / 2  # 以固定边的中点作为多边形中心\n",
    "    angles = np.arctan2(all_points[:, 1] - center[1], all_points[:, 0] - center[0])\n",
    "    \n",
    "    # 按角度排序点，形成闭合多边形\n",
    "    sorted_indices = np.argsort(angles)\n",
    "    polygon_points = all_points[sorted_indices]\n",
    "    \n",
    "    # 生成随机颜色\n",
    "    color = np.random.rand(3)\n",
    "    \n",
    "    # 绘制多边形\n",
    "    plt.fill(polygon_points[:, 0], polygon_points[:, 1], color=color, alpha=0.8)\n",
    "    \n",
    "    # 绘制固定边\n",
    "    plt.plot(fixed_edge[:, 0], fixed_edge[:, 1], 'r-', lw=2, label='Fixed Edge')  # 固定边用红色表示\n",
    "    \n",
    "    # 绘制顶点和轮廓\n",
    "    plt.plot(polygon_points[:, 0], polygon_points[:, 1], 'k-', lw=1.5, label='Polygon Edges')  # 多边形轮廓\n",
    "    plt.scatter(all_points[:, 0], all_points[:, 1], color='black')  # 所有顶点\n",
    "    \n",
    "    # 设置图形显示\n",
    "    plt.gca().set_aspect('equal')\n",
    "    plt.axis('off')\n",
    "    plt.legend()\n",
    "    plt.show()\n",
    "\n",
    "# 固定一条边的两个点\n",
    "fixed_edge = [(0.2, 0.2), (0.8, 0.2)]\n",
    "\n",
    "# 调用函数生成包含固定边的随机多边形\n",
    "generate_polygon_with_fixed_edge(fixed_edge=fixed_edge, num_points=10)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from scipy.spatial import ConvexHull\n",
    "\n",
    "def generate_polygon_with_fixed_edge_using_convex_hull(fixed_edge, num_points=10):\n",
    "    \"\"\"\n",
    "    使用凸包算法随机生成一个多边形，其中一条边固定，其他边随机\n",
    "    :param fixed_edge: 固定边的两个顶点，例如 [(x1, y1), (x2, y2)]\n",
    "    :param num_points: 除固定边外的随机顶点数量\n",
    "    \"\"\"\n",
    "    # 转换固定边为 NumPy 数组\n",
    "    fixed_edge = np.array(fixed_edge)\n",
    "    \n",
    "    # 随机生成其他点\n",
    "    random_points = np.random.rand(num_points, 2)  # 在 [0, 1] 范围内生成点\n",
    "    \n",
    "    # 合并固定边的两个点和随机生成的点\n",
    "    all_points = np.vstack([fixed_edge, random_points])\n",
    "    \n",
    "    # 使用凸包算法生成多边形\n",
    "    hull = ConvexHull(all_points)\n",
    "    polygon_points = all_points[hull.vertices]  # 获取凸包顶点的坐标\n",
    "    \n",
    "    # 生成随机颜色\n",
    "    color = np.random.rand(3)\n",
    "    \n",
    "    # 绘制多边形\n",
    "    plt.fill(polygon_points[:, 0], polygon_points[:, 1], color=color, alpha=0.8)\n",
    "    \n",
    "    # 绘制固定边\n",
    "    plt.plot(fixed_edge[:, 0], fixed_edge[:, 1], 'r-', lw=2, label='Fixed Edge')  # 固定边用红色表示\n",
    "    \n",
    "    # 绘制顶点和轮廓\n",
    "    plt.plot(polygon_points[:, 0], polygon_points[:, 1], 'k-', lw=1.5, label='Polygon Edges')  # 多边形轮廓\n",
    "    plt.scatter(all_points[:, 0], all_points[:, 1], color='black')  # 所有顶点\n",
    "    \n",
    "    # 设置图形显示\n",
    "    plt.gca().set_aspect('equal')\n",
    "    plt.axis('off')\n",
    "    plt.legend()\n",
    "    plt.show()\n",
    "\n",
    "# 固定一条边的两个点\n",
    "fixed_edge = [(0.2, 0.2), (0.8, 0.2)]\n",
    "\n",
    "# 调用函数生成包含固定边的随机多边形\n",
    "generate_polygon_with_fixed_edge_using_convex_hull(fixed_edge=fixed_edge, num_points=10)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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+vXj2WefpU2bNnz11Vc8+uijtfCdNVyrVq06biCCc+6//7l9FYgih2nQw6fV6dChAyNHjuSuu+7it99+Izo6mltuuYXWrVszcuTIap/XuXNnzj//fCZMmMCNN96Ir69v5dfuueceYmJimDBhAnFxcSxatKhyAU1Fz9djjz3GTz/9xOTJk4mLi2PhwoW89dZbPP7446f9PRUXF5Oenl7lo2JV6NChQ+nYsSO33XYb0dHRrFq16qhFQDfddBMOh4O7776bHTt2sHTpUl577bUq9d9///0cPHiQG2+8kbVr15KYmMjSpUu5/fbbsdvtrFmzhhdffJF169aRnJzMkiVL2L9/vw48rgVpaWk1ep1IQ6FQrMb8+fM555xzuOKKK+jbty+GYfDdd98dNXR5pDvvvJOSkhLuuOOOKo+3bduWxYsXs2TJEnr06MGcOXMqg6fiL/Wzzz6bRYsW8dlnn9GtWzeeffZZnn/+ecaMGXPa388PP/xAaGholY/+/Z07klitVr766isKCwvp06cPY8eOZcqUKVWe37hxY/773/+yadMmzjrrLCZOnMizzz4LUDnP2KpVK1avXo3dbufiiy+me/fuPPLIIwQFBWG1WmncuDG//vorl112GR07duSZZ57h9ddfZ/jw4af9/UlVFXf8NXWdSENhMYzTWw/f0E9HP9LkyZP54osv2Lx58wmvnTJlCnPnziUlJaUOKqt5H3/8Mbfffjs5OTlV7oprin62/jm73U5kZCR79uw5ZsuLxWIhLCyMpKSkWh2aF3E3DXpHm5qUn5/Prl27eOutt3jhhReOec3s2bM599xzCQkJYfXq1bz66qs88MADdVzpP/fBBx/Qrl07WrduTXR0NBMmTOC6666rlUCU02Oz2ZgxYwajRo3CYrFUCcaK4e7p06crEEWOoOHTGvLAAw9wzjnnMHDgwKOGTivEx8czcuRIunTpwuTJk3nssceYNGlS3RZ6GtLT07nlllvo3Lkz48eP59prrz2p3XTEHFFRUSxevJjWrVtXeTwsLIzFixdXWQgmIk4aPhWXpZ+tmmG321m1alXl6uIBAwboDlGkGho+FannbDYbAwcONLsMEbdQY8Onp3nDKXIU/UyJSF077VCsaFE4dOjQaRcjcriKn6kTtcGIiNSU0x4+tdlsBAUFVe696efnpwNI5bQYhsGhQ4fIyMggKChI818iUmdOe6ENOH+JpaenVzkXUOR0BQUF0bJlS/2RJSJ1pkZCsYLdbj/meYMip8rT01N3iCJS52o0FEVERNyZmvdFRETKKRRFRETKKRRFRETKKRRFRETKKRRFRETKKRRFRETKKRRFRETKKRRFRETKKRRFRETKKRRFRETKKRRFRETKKRRFRETKKRRFRETKKRRFRETK/T/HArw53RxiAQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "def generate_polygon_based_on_fixed_edge(fixed_edge, num_points=8):\n",
    "    \"\"\"\n",
    "    随机生成一个多边形，以一条固定边为基础\n",
    "    :param fixed_edge: 固定边的两个顶点，例如 [(x1, y1), (x2, y2)]\n",
    "    :param num_points: 除固定边外的随机顶点数量\n",
    "    \"\"\"\n",
    "    # 转换固定边为 NumPy 数组\n",
    "    fixed_edge = np.array(fixed_edge)\n",
    "    p1, p2 = fixed_edge[0], fixed_edge[1]\n",
    "    \n",
    "    # 计算固定边的方向和垂直方向\n",
    "    edge_vector = p2 - p1\n",
    "    perpendicular_vector = np.array([-edge_vector[1], edge_vector[0]])\n",
    "    \n",
    "    # 随机生成点，围绕固定边\n",
    "    random_points = []\n",
    "    for _ in range(num_points):\n",
    "        t = np.random.uniform(0, 1)  # 在固定边上随机插值\n",
    "        random_point_on_edge = p1 + t * edge_vector  # 固定边上的随机点\n",
    "        random_offset = np.random.uniform(-0.5, 0.5) * perpendicular_vector  # 偏移\n",
    "        random_points.append(random_point_on_edge + random_offset)\n",
    "    \n",
    "    random_points = np.array(random_points)\n",
    "    \n",
    "    # 合并固定边的两个点和随机生成的点\n",
    "    all_points = np.vstack([fixed_edge, random_points])\n",
    "    \n",
    "    # 按角度排序形成闭合多边形\n",
    "    center = np.mean(all_points, axis=0)  # 多边形的中心点\n",
    "    angles = np.arctan2(all_points[:, 1] - center[1], all_points[:, 0] - center[0])\n",
    "    sorted_indices = np.argsort(angles)\n",
    "    polygon_points = all_points[sorted_indices]\n",
    "    \n",
    "    # 生成随机颜色\n",
    "    color = np.random.rand(3)\n",
    "    \n",
    "    # 绘制多边形\n",
    "    plt.fill(polygon_points[:, 0], polygon_points[:, 1], color=color, alpha=0.8)\n",
    "    \n",
    "    # 绘制固定边\n",
    "    plt.plot(fixed_edge[:, 0], fixed_edge[:, 1], 'r-', lw=2, label='Fixed Edge')  # 固定边用红色表示\n",
    "    \n",
    "    # 绘制顶点和轮廓\n",
    "    plt.plot(polygon_points[:, 0], polygon_points[:, 1], 'k-', lw=1.5, label='Polygon Edges')  # 多边形轮廓\n",
    "    plt.scatter(all_points[:, 0], all_points[:, 1], color='black')  # 所有顶点\n",
    "    \n",
    "    # 设置图形显示\n",
    "    plt.gca().set_aspect('equal')\n",
    "    plt.axis('off')\n",
    "    plt.legend()\n",
    "    plt.show()\n",
    "\n",
    "# 固定一条边的两个点\n",
    "fixed_edge = [(0.2, 0.2), (0.8, 0.2)]\n",
    "\n",
    "# 调用函数生成以固定边为基础的多边形\n",
    "generate_polygon_based_on_fixed_edge(fixed_edge=fixed_edge, num_points=10)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 457,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAGFCAYAAADNbZVXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA5CUlEQVR4nO3de3hU1b038O/eM5NkMkmYZMIlkEAgXAwIgYiREBGiVMVjn1rAa08hFo71cnqwHp9yij2+vvU9WtuKpMpFrXI5gkcLkXqrqC20NFZQ0XiUACEXkskFCCEJyUzmtuf9Y7J3MiSEEGb2nsv38zw+lWEzs6AxX35rrd9agtfr9YKIiEglotYDICKi6MLgISIiVTF4iIhIVQweIiJSFYOHiIhUxeAhIiJVMXiIiEhVDB4iIlIVg4eIiFTF4CEiIlUxeIiISFUMHiIiUhWDh4iIVMXgISIiVem1HgARBY/H44HL5dJ6GBQhYmJiIIqXX68weIgikNfrRVNTE1pbW7UeCkUQURQxfvx4xMTEXNb7CLwIjijyNDY2orW1FSNGjEB8fDwEQdB6SBTmJElCQ0MDDAYDxo4de1lfU6x4iCKMx+NRQsdisWg9HIogw4cPR0NDA9xuNwwGw5Dfh5sLiCKMvKYTHx+v8Ugo0shTbB6P57Leh8FDFKE4vUaBFqivKU61UdjyeDzYv38/GhsbkZaWhnnz5kGn02k9LCK6CFY8FJZKSkqQmZmJwsJC3HPPPSgsLERmZiZKSkq0HhoFyYIFC/Dwww8H9TOeeOIJzJw5M2zeN1wxeCjslJSUYOnSpbBarX6v19fXY+nSpQyfMFZUVARBEPr8c/z4cZSUlODJJ5/UdHw1NTX9jk8QBHz66aeaji2ccKqNworH48GqVavQXxeA1+uFIAh4+OGH8b3vfY/TbmHq5ptvxubNm/1eGz58eEj9//nxxx9j2rRpfq9xB+HgseKhsLJ///4+lU5vXq8XdXV12L9/v4qjokCKjY3FqFGj/P7R6XR+U21HjhxBfHw8duzYofy6N998E0ajEYcPHwYAtLa2YuXKlRg+fDiSkpJw/fXXo6yszO+zfvWrX2HkyJFITEzEihUr0NXVNagxWiyWPmPsvb34Yu/rdrvxb//2bzCbzbBYLFi9ejWWL1+O2267TXlGkiQ8/fTTGD9+PIxGI3JycrBz585L+aMMWQweCivyN5WLuXPpXVjy3Tvw7K/XorS0FJ2dnUEeGanpiiuuwG9/+1s8+OCDqK2thdVqxf33349nnnkGU6dOBQDcfvvtOHXqFP70pz/hiy++QG5uLm644Qa0tLQA8AXVE088gaeeegqff/450tLSsGHDhsse22De95lnnsH27duxefNmlJaWor29Hbt37/Z75umnn8a2bduwadMmfPvtt/jpT3+Kf/7nf8Zf//rXyx6j1nhyAYU8l8uFd/74DtYXb8S+0r9A8kqX/B6iIGJc+njMypmF/GvnYE7BNZg5cyYSEhKCMGJtdXV1obq6GuPHj0dcXFzPT8yeDTQ1qT+gUaOAzz8f1KNFRUV47bXX/Ma9aNEi/OEPf8CCBQswc+ZMrFu3Tvm5W2+9Fe3t7YiJiYFOp8MHH3wAQRDw97//Hf/0T/+EU6dOITY2Vnl+4sSJ+NnPfob77rsPc+fOxaxZs7B+/Xrl5+fMmYOuri589dVX/Y6vpqZGqUDOP7Oso6MDAAb1vqNGjcKjjz6KRx99FIBvCnnChAmYNWsWdu/eDYfDgZSUFHz88cfIz89X3mflypWw2Wx+lZ6aLvi1dYm4xkMh69tvv8X6dRvx+hs70HrurPK6TtDB471wA1tSXDLuyP0R6s5Wo/ZMFayt1TjnbEN1XSWq6ypR8q5vukIQBGSOGY+ZObMw59prkF8wB7NmzYrIMALgC536eq1HcVGFhYXYuHGj8mOTyXTBZ1999VVMnjwZoiji22+/VfpMysrK0NHR0WfdxW63o7KyEgBQXl6O+++/3+/n8/PzsXfv3ouO8Y033kB2dna/P3ex921ra8PJkyeRl5en/LxOp8NVV10FSfL9per48eOw2Wz4zne+4/c+TqcTs2bNuuj4Qh2Dh0JKW1sb/nvra3hxw0v45ujXyusJMUm4etx1mDuxEE3t9XildO0F3+P2q+7FjPSrMSPj6p73tZ9FbUsVas9UovZMNerbqtHuaEW1tQrV1iq89d4uAOeFUcE1yL82gsJo1Kiw+FyTyYSJEycO6tmysjJ0dnZCFEWlnwvwVR9paWnYt29fn19jNpsvaTz9ycjIGPQYh0Kunt577z2MGTPG7+d6V3DhisFDmpMkCXv37sP6dRvx/p534HA5AACioEP2iJmYO6kQU9NmQif6vlxHJo3BioJHsOvQFrTaW5T3MRstWJK7HDnpeX0+Y5gxGdPHXIXpY65SXmu3t6K2pRInzlShrqUK1tYatDvO9htG40aPx8ycmX5hlJiYGMw/lsAb5HRXuGhpaUFRUREee+wxNDY24gc/+AEOHToEo9GI3NxcNDU1Qa/XIzMzs99fn52djQMHDmDZsmXKa4HYEn2x9x02bBhGjhyJzz77DNdddx0A31TboUOHlF6fqVOnIjY2FrW1tZg/f/5ljynUMHhIM7W1tXhpw8vYvHkzGk71TAGNMI3GnAmFyJswD0lx5n5/bU56HqaPno3K5nK021uRZDQjKzX7ku4KSTKaceWYq3Bl7zDqakVtSxXqmqtwoqVSCaOa+irU1Fdh9/u+HiFBEDA2LbNPGCUlJQ3tD4Mu2f3334+MjAz84he/gMPhwKxZs/Doo49i/fr1WLhwIfLz83Hbbbfh17/+NSZPnoyGhga89957+P73v4/Zs2dj1apVKCoqwuzZs1FQUIDt27fj22+/xYQJEy762WfOnEHTeetlZrMZcXFxg3rfn/zkJ3j66acxceJEXHHFFXj++edx9uxZZaowMTERjz76KH76059CkiRce+21aGtrQ2lpKZKSkrB8+fLA/mGqjMFDqurq6kLJrrewoXgjPvns7/DCt7clVheHWen5yJ94PTItEwd1JpQoipg0YtpFn7sUSXFmXDk6F1eOzlVe6x1GtS2+NaM2x1mcaKjGiYZq/PFPbwHoFUYzZvrWjBhGQbNt2za8//77+PLLL6HX66HX6/Haa6/h2muvxa233opFixbh/fffx2OPPYZ7770Xp0+fxqhRo3Dddddh5MiRAIA777wTlZWV+NnPfoauri4sWbIEDzzwAPbs2XPRz1+4cGGf115//XXcddddg3rf1atXo6mpCcuWLYNOp8N9992Hm266ya9X6cknn8Tw4cPx9NNPo6qqCmazGbm5uVizZk0A/gS1xV1tpIpDhw5h/bqN+MOuN3HO1q68nmXJRn5WIWZmXIMYffjMXZ/ravNbM7K2VaOtq6XfZ88Po9zc3KCGUaB2HpF6JElCdnY27rjjDs1PZxgId7VRyDtz5gw2v7IFL2/6PY5VH1FeHxaXgrzM+cjPWoDUhJEajnDoEuOGYdroWZg2umeH0bmuNtS1VKH2TBVOnKlSwqi2sQa1jTV4e89u5dmMtHHImT4T+QXXIH+eL4yGDRumwe+EtHDixAl8+OGHmD9/PhwOB1544QVUV1fjnnvu0XpoqmDFQwHl8Xiw54M9WF+8CR/+5QO4Pb67YXSCHlemXYW5E6/HlJHTA3Jvezg419WOupZK1J6Rp+lq0Np1pt9n5TCaU3AN5l5GGLHiCX11dXW466678M0338Dr9eLKK6/Er371K2WzQagK1NcWg4cC4vjx49j0wovY9t/bcLrllPL66KRxyJ+wALMz58EUGwFbkgPgXFc76s5WobbXmtGFwih91Ng+YXSx7cAMHgoWBg9prrOzE/+z43/w4vqX8VnZAeV1o96Eq8YWID9rATJSLr5DiIAORzvqWqpRe8a3vXvAMBqZgRnTZ2LO3Dzkz5uDq666CsnJycrPM3goWBg8pAmv14t//OMfWL9uI3a/UwJblw0AIEDA5OHTkT+xENPHzIZBN/T72MmnJ4yqlBMYznY19/vsmJEZvspobh4K5s/FyJEjkZWVxeChgGLwkKqamprw+xdfxSu/fwU11irl9RTjcMwZvwDXZM1HcnyqdgOMEp2Oc77ddC3VqDtTibrWGpy1n/Z7Zty4cdi0aRNGjUqDKT4eJpMJCYkJiI+Ph17P/UQ0dNzVRkHncrnw7tvvYn3xRuwt/bNyjpRBjMGM0XmYO7EQWSOyIQrRsVEgFJhiE5GdloPstBzltU5Hh2/NqLsyEuJ8Gzrcbhfa2tvQ1t4GNPqeNegNMBrjkZBgginBBJPJxDAi1fErjvo4fPgwNvxuE3a8vh1n23t6U8aas5A/oRC5mXNhNMRrOELqzRSbgCtGzcAVo2YAAIwpBpiNFiSbhkOSPHC6HXB5HHBLbrjcLrjOtaH9XJvy6xlGpDZ+dREA3+Gcr23bjhc3vIT/PdJzWZYpJgl54+Yhf+L1GJU0ZoB3oFAiCAJidbEwxMQor0leD5weJ5xuB8OINMWvpCgmSRL27fsr1q/bgPc+6H04p4jsETORP7EQ00bPUg7npPAmCjrE6Y2I0xuV1ySvBy6PE45LCCNTggkJCSbEx8f73boZCrZs2YKHH34Yra2tWg8laARBwFtvveV3W2m44XeUKFRXV6cczll/sucaad/hnAuQN/46JBnN2g2QVCMKOsTqjYj1CyMJLo/jEsLI6LeB4XLCqKioCFu3bvW9t8GAsWPHYtmyZVizZk3EVVy9f6+93XTTTfjggw80GJF6Iuv/Sbogh8OhHM5ZenB/P4dzFiLTMmlQh3NSZBMF8YJhJE/TOT1OuCVXdxi50H6uHeg+rPlyw+jmm2/G5s2b4XA48P777+Ohhx6CwWDAz3/+80D/VjUn/157i4T7di6G25Ei3JdffomVy+/DCMtI3PODu/H3g3+DF15MSLkC91z9AP7fbZtwz5wfY3zqZIYOXZAcRolxZlgSRiJtWAbSzZkYkZgGszEF8QYT9KIvXFxuXxA1NjWioqICZWVlKPuqDMeOHEO9tR5tbW1wuVwX/KzY2FiMGjUK48aNwwMPPICFCxfi7bffBgCcPXsWy5YtQ3JyMuLj47Fo0SJUVFT0+z41NTUQRRGfn3cP0bp16zBu3Dhll+bbb7+NSZMmIS4uDoWFhdi6dSsEQfCbrtu1axemTZuG2NhYZGZm4tlnn/V7z8zMTDz11FP40Y9+hMTERIwdOxYvvfTSRf9c5d9r7396NwNXVFTguuuuQ1xcHKZOnYqPPvqoz3t88sknmDlzJuLi4jB79mzs3r0bgiD4Xd/9zTffYNGiRUhISMDIkSPxwx/+EM3NPT1hO3fuxPTp02E0GmGxWLBw4UJ0dnZedPxDxYonArW0tGDLq9vw8qaXcaTysPL6sNhk5GXOx5yJCzA8QaPbKEkTXq8XNrstKO8twoA40YA4EYBX6tnA4HHA5XFBH6PzVUYdLrR39FRGer0BxjgjEhJ6KqP+GI1GnDnjO8WhqKgIFRUVePvtt5GUlITVq1fjlltuweHDh/tUVZmZmVi4cCE2b96M2bNnK69v3rwZRUVFEEUR1dXVWLp0KVatWoWVK1fiyy+/xKOPPur3Pl988QXuuOMOPPHEE7jzzjvxySef4MEHH4TFYkFRUZHy3LPPPosnn3wSa9aswc6dO/HAAw9g/vz5mDJlypD+XCVJwuLFizFy5EgcOHAAbW1tePjhh/2eaW9vx3e/+13ccsst2LFjB06cONHnmdbWVlx//fVYuXIlnnvuOdjtdqxevRp33HEH/vKXv6CxsRF33303fv3rX+P73/8+zp07h/379yOYLZ4Mngjh8Xjw4Z4PsX7dRuzp53DO/ImFuGLkjKg5nJP82ew2ZM0Yq8lnV5bVQB+r7zNN53a7cK7DhXO9wqilpQU2mw311nrEm+Jx4MAB7NmzBz/5yU+UwCktLcXcuXMBANu3b0dGRgZ2796N22+/vc9nr1y5Evfffz/Wrl2L2NhYHDp0CP/7v/+LP/7xjwCAF198EVOmTMFvfvMbAMCUKVPwzTff4L/+67+U91i7di1uuOEG/Od//icAYPLkyTh8+DB+85vf+AXPLbfcggcffBCA776d5557Dnv37h0weN59990+16qvWbMGa9aswccff4wjR45gz549GD16NADgqaeewqJFi5Rnd+zYAUEQ8PLLLytVUX19Pf7lX/5FeeaFF17ArFmz8NRTTymvvfrqq8jIyMCxY8fQ0dEBt9uNxYsXY9y4cQCA6dOnX3DMgcDgCXOVlZW+wzm3bcOplpPK62mJY5GfVYirM6+FKTbMrmimyNLPmpFXqYy64HQ74fQ44JZc3Tst92HS5Elwu92QJAmLFi3CPXf/APv3/x16vR65uT2X9FksFkyZMgXl5eX9fvRtt92Ghx56CG+99RbuuusubNmyBYWFhcp12EePHsXVV1/t92vy8vyvTi8vL8f3vvc9v9cKCgqwbt06eDwe5fK2GTNm9PyWBQGjRo3CqVOnMJDCwkJs3LjR77WUlBTlczMyMpTQAYD8/Hy/Z48ePYoZM2b4nSJw/vjLysqwd+/ePgEH+L5/3Hjjjbjhhhswffp03HTTTbjxxhuxdOlSvym/QGPwhCGbzYY3Xn8DG194CZ991XOXOw/npAuJN8aj8utazT77fIIgIlYfh1h9zzdMr1eC0RCPa66eg1+s+U9A9CLZYoZer4dHcuPs2RZ4vV6UlZUhNibWt7XbFA+PxwOPx9PvZ8fExGDZsmXYvHkzFi9ejB07dqC4uDgov8/zp/oEQVDWkS7EZDJh4sSJQRmPrKOjA9/97nfxzDPP9Pm5tLQ06HQ6fPTRR/jkk0/w4Ycf4vnnn8djjz2GAwcOYPz48UEZE4MnTHi9Xnz66afYULwJJX/c6Xc456ThV2JuViGmp8+GQRdzkXeiaCQIAkzxJq2HMSBBECGKOiQlJCF3qq8K8fZaM5o6aRo8Hg+++eYb5OTk4FxHO+qstTh27Bji4+Px1ZdfobGxCV6vF62trYiPj0dMTAxWrlyJK6+8Ehs2bFCmlGRTpkzB+++/7zeOzz77zO/H2dnZKC0t9XuttLQUkydP9ruqOtCys7NRV1eHxsZGpKWlAQA+/fRTv2emTJmC1157DQ6HQ9kNd/74c3NzsWvXLmRmZl5wS7ogCCgoKEBBQQEef/xxjBs3Dm+99RYeeeSRIPzOuKst5J08eRJP/fJpZI2dhLlz5+K1N7bB1mVDsnE4Fk1div9z6/P41+sfQ+64uQwdijhyZZQYNwy50/Jw88JF+PWvfoMTx6xoPHEK//eJX2LEiBGYP38+3B43urrskCQJx48fx9dff42vvvwKoiAid1ausqBuNPZM+f34xz/GkSNHsHr1ahw7dgxvvvkmtmzZ0v3Zvl2e//7v/44///nPePLJJ3Hs2DFs3boVL7zwQp9NCEPhcDjQ1NTk94+822zhwoWYPHkyli9fjrKyMuzfvx+PPfaY36+/5557IEkS7rvvPpSXl2PPnj347W9/6zf+hx56CC0tLbj77rvx2WefobKyEnv27MG9994Lj8eDAwcO4KmnnsLnn3+O2tpalJSU4PTp08jOzr7s39+FsOIJQS6XC++9+x7Wr9uIvX//MzySbxrBdzjn1cifeD0m8nBOikLrnnkBv3jy5/jR/cvhcrkw5+p8vLF5FzJTx8PpcSI+JgGCIEAvGnwbGDxunOs4h0W3LMLnX3yOgoICfPXlV0qfkdmcjNdffx3/8R//geLiYuTn5+Oxxx7DAw88oFQQubm5ePPNN/H444/jySefRFpaGn75y1/6bSwYqg8++ECpZmRTpkzBkSNHIIoi3nrrLaxYsQJ5eXnIzMzE7373O9x8883Ks0lJSXjnnXfwwAMPYObMmZg+fToef/xx3HPPPcq6z+jRo1FaWorVq1fjxhtvhMPhwLhx43DzzTdDFEUkJSXhb3/7G9atW4f29naMGzcOzz77rN8mhkDjtQghpLy8XDmcs6Wt5xKwjGFZyM9agKvGFcAYw8M5aWDGFAOm3zUWY0alR3UV7IUEl9t3HFDxhuew58MPsOP1Hf0+q9fpYYwzwpRgwqYXN2Hr1q2ora0Ny9627du3495770VbW5tfdRcIvBYhQrS3t2P7azvw4vqXUHb4S+V1kyERV4+bh/yJhUgblqHhCInCkwARLocb1voG/M8b/4P/+OkapCdn+sKo+xQGl9uBHW/swNSpUzFs2DB8/fXXKC4uxh133IGyr8pgjDMivvtsOpPJBIPBEHJhtG3bNkyYMAFjxoxBWVlZv1OKoYbBowGv14t9+/6KDcUb8c6f3obD2QXA1x1+xYgczJ14PQ/nJAqAn//f1dj9Tglu/s4tuPv2H0CAiBh9HGL0cUD3yTRnT7XhZ5tXo7XtLNJGpWHZPy/DD5f/0DdN13kO5zrP4WR3p4JOroxMJiQkhkYYNTU14fHHH0dTUxPS0tJw++23+/UhhSJOtanIarX6Dud8dTOsJ+uU14eb0ny3eE6Yz8M56bJxqu3yydN0zu7DUl1uJ1ySs99nQzGMgoVTbWHC4XDgrZLd2PC7jSg9sB+S17evP0YX6zucM6uQ56QRhZjelVFCd2XUO4x8pzD4wsjjcaOj8xw6Os/hZHe/qE7UKX1G8nFAMTEx/O+8G4MnSL766iusL96IN//wBto7e46RH58yBflZhZg1do5f8xwRhbb+pum88MLVfS6dXxhJnl5h5Jun84WRrzIyJSTAZIreMGLwBFBLSwu2bf5vvLTpZZQf/1Z5PSk2GXmZ1yE/qxDDE3k4JwVXd1Ed1EMeyUeA0H8YeXwhJB8J1BNGHejo7ADCNIwC9TXF4LlMHo8HH330MdY/twF7/vIBXG7fPLBO0GHaqKswd2IhrhiVw8M5STWOdhccHU6cjT+DYQlmblLRgAD/I4G88MLtccHlccHlccLldsLtdfUbRqIgIi4uDkajEcZ4o3Kf0aWGkdfrhc1mg9PpRExMDOLj4y8r0LxeL06fPg1BEC775lluLhiiqqoq5XDOk2ealNdHJWYgf0Ihrh5/LRJikzQcIUWzmAQdxl5rQfK4BAi60PzbM3nhkTxwS264PS54JDc83v7PnBMEATGGGMTExiA2NhaxsbED3shqs9nQ0tLid4adTqdDSkrKBa+fGAxBEJCent7vgaOX9D4MnsGz2Wx4840/YNPzL+LAl/9QXo/Tx+OqjALkTyxERvL4kC2TKfrojSL0cTrwSzI8uDwunDrXhMa2WjSerUNjWz2abU2Q+gmkhPhETJowGdNnTMesq3Mwffp0jBkzBh999BFWrVrVZ1pM/r5UXFyMG2+8cUjjMxgMATmfjsFzEV6vFwcPHsT65zZi1x93wtblu5VPgIBJqdOQn1WIGRlXc9sqEQWFy+NCY1stTpypQu2ZSljPVqPpnLXf6ijRlASHswtOV/9bv+WKpbq6OqgHnF4Mg+cCTp06hVdf3oyXX/o9qmqPK68nG4djTuZ8XJO1ACmmVA1HSETR6lLCqD979+7FggULgjvIAUTNqqPH48H+/fuVI8bnzZvXJ/Hdbjfeffc9bCjeiL/87WPlcE69aMCM0XmYO7EQE0dM5eGcRKQpg86AsSlZGJuSBUz6DgBfGO098i7e/eaNi/76xsbGYA9xQFERPCUlJVi1ahWsVqvyWnp6OoqLi7F48WIcOXIEG363Cdt3bEdLW7PyTMawCZiTVYjZPJyTiEKcQWfA+OGTB/Xs+Sdiqy3ip9pKSkqwdOnSC+4/z0yfgBprlfJjkyERs8dei/yJ12O0mYdzElH4kCQJT7z7r2i1t/T781zjUYHH40FmZqZfpdMfESKuGJmD/ImFmJaWC70uKgpBIopAZdaDeKV0bZ/X5V1tO3fu9LuFVQsRHTz79u1DYWHhRZ/70dyHMTNjjgojIqJgkSQJlc3laLe3IsloRlZqdtQ2bpdZD2LXoS1+lU9GRgbWrVuneegAEb7GM9gFNHkTARGFp/6+0ZqNKViSW4Sc9DwNR6aNnPQ8TB89Gxv3/QpHT3+NomX34vevvqzp9FpvEf3XgcEuoPEqAqLwJU8tnb+u0WpvwSula1FmPajRyLQliiJSTMMBAKOGjwqZ0AEiPHjmzZuH9PT0AU8SMBstyErNVnFURBQokiRh16EtAz6z69BWSJKkzoBCjEHnO1PNZrNrPBJ/ER08Op0OxcXFAz6zJHd51M4DE4W7yubyC+7gkrXaz6CyuVylEYUW+USVLjuDR1WLFy/Gzp07YYo3+b1uNlqwouCRqJz/JYoU7fbWgD4XaeQdunZ7l8Yj8RfRmwtkixcvxsbil/Dx3/bg6nHXYc6E+VG944UoUgx2fTZa13F7Kp7QCp6o+c5bZ60FAMzMuAaTRkxj6BBFgKzUbJiNKQM+E83ruPIaj72LwaOJhqZ6AEBqwgiNR0JEgSKKIpbkFg34TDSv4+q7Kx6Hg8Gjura2NpyztQMAUuKHazwaIgqknPQ8rCh4pE/lw3VcIEbvq3i6uhwaj8RfVKzx1NTUAADiDQmINcRpOxgiCji5YZInF/jTi6FZ8URF8FRXVwMAUoysdogilSiKmDRimtbDCCkGfffmAkdoVTxR8deBiiO+i9zkLl4iomhgEH1TbaFW8URF8Bw/yuAhouij18nBw4pHdZWVvqm21ETuaCOi6CFvp3a6GDyqq6s7AQBISWDFQ0TRwyBvLnAyeFRXf1Lu4Rmp8UiIiNQjT7U5nU6NR+Iv4oPn7Nmz6LR3AABS4lM1Hg0RkXo41aYRuYfHFJOEGH2stoMhIlKRUvG4nQily6YjPnh6enhY7RBRdJHXeLxeL1wul8aj6RHxwcMeHiKKVnLFAwBdIXRQaBQETwUABg8RRR+92HM4DYNHRVVVNQDYw0NE0UcQBOhF+aBQBo9q5Ht4LLwOgYiiEINHZV6vFw3dPTwWE4OHiKKPPN3G4FFJS0sLbF2dAIBk9vAQURRixaMyuYcnIWYYYrqPByciiiYGBo+6qqq6e3h46ygRRSl5SzWDRyVKDw+n2YgoSunF0LsaIcKDx9fDwx1tRBStDDrfMoPdbtd4JD0iOniqq2sAABb28BBRlJIrHruNwaMKuYcnlRUPEUUp+YRqWyeDJ+i8Xi8aTvl6eHhcDhFFK3lzgc1m03gkPSI2eJqbm9Hl8CU8e3iIKFopU22seIJP7uFJijUrpSYRUbRRNhdwjSf45B6eZCOn2Ygoesl/8bbb2ccTdBXlvA6BiKhnjYcVT9BVHPU1j1oSGDxEFL3kqbYu9vEEn9LDw63URBTFDDwyRz119d09PGweJaIoZtDLJxcweILK6/Wi8SR7eIiIWPGo5NSpU3C4HBAgINnIHh4iil7KGg+DJ7h69/DodXptB0NEpCG54nE4GDxBVVVVBYD38BAR6XW8FkEVFeW+rdTJXN8hoiinrPGw4gkupYfHxB1tRBTd9KJvjYcVT5DVdPfwpCay4iGi6Kas8TgZPEEl9/BYEkZqPBIiIm3Jazwul1PjkfSIuOCRJAkNpxoAABau8RBRlJO3UztcrHiC5uTJk3C5nRAgwByfovVwiIg0Zei+j8fJiid45B6eYXEp0Ins4SGi6CZPtTF4gog9PEREPeTNBZLkgdvt1ng0PhEXPEe/PQaA110TEQE926mB0Dk2J+KCp7LCV/HwOgQiIvgdG8bgCZKeHh4GDxGRKIjQCb7wYfAESV1DHQBWPEREMr0YWlcjRFTwSJKEptPs4SEi6k0fYnfyRFTwNDY2wuV2QRREDDOyh4eICOjp5WHwBEFPD48FOlGn7WCIiEIEp9qCqOp4dw8Pbx0lIlIweILoaHkFACCF6ztERAoD13iCp/JYJQAgJYHBQ0QkY8UTRDUnagAAwxN5HQIRkUxuIrXZbBqPxCeigqeuXu7hYcVDRCSTj82xd9o1HolPxASPx+PByeZGAFzjISLqTV7jsTF4AquhoQFujxs6QYdhcezhISKS6ZXg4VRbQPXu4RHFiPltERFdNrnisdu4uSCgKuUeHl6HQETkx9C9xtPVxam2gDpW7ruHh+s7RET+9Kx4guP4MfkeHgYPEVFvBl33rjY7K56AOtHdw5PKHh4iIj/KGo+dFU9AWeV7eEy8h4eIqLeeI3NY8QSM2+1GU3MTAK7xEBGdz6CXNxc4NB6Jj/7ij4S++vp6SJIHOkGPJKNZ6+FQFJMkCZXN5Wi3tyLJaEZWaja395PmQu2Q0IgIHrmHx2y0QBT4Hzlpo8x6ELsObUGrvUV5zWxMwZLcIuSk52k4Mop2+u7NBQ5HaARPRHyXZg8Paa3MehCvlK71Cx0AaLW34JXStSizHtRoZERATIhNtUVE8Bw9zB4e0o4kSdh1aMuAz+w6tBWSJKkzIKLzyNciOJyseAKmsqK7h4c72kgDlc3lfSqd87Xaz6CyuVylERH5k9d4HA5WPAGj9PAkMXhIfe321oA+RxRo8skFDieDJ2Dq2MNDGhrsTkruuCStyGe1ORk8geFyuXD6zEkAXOMhbWSlZsNsHPgqDrPRgqzUbJVGROSPFU+AWa1WSF4JelGPxLhhWg+HopAoiliSWzTgM0tyl7OfhzQjX33tdDk1HolP2P+XIPfwJMelsoeHNJOTnocVBY/0qXzMRgtWFDzCPh7SlDLV5gqNiifsG0iPV1QCAJLjOc1G2spJz8P00bN5cgGFHHlXm0fywO12Q6/X9lt/2AfPscMVALi+Q6FBFEVMGjFN62EQ+ZHXeADflmqtgyfs/ypW1X1qQWoid7QREfVHbiAFQuO8trAPnpruHh5LAoOHiKg/OlEHUdABCI0m0rAPHuUeHt48SkR0QXrRN73GiucyOZ1OnD57CgDXeIiIBiJPtzF4LlNdXR28Xi8MYgwSY9nDQ0R0IQYGT2AoPTzGVAiCoO1giIhCGCueADl+7DgAIJn38BARDUgfQreQhnXwHCv3BQ/Xd4iIBiafXsDguUzyzaOp3EpNRDSgUKp4wvrkAvkeHkuENo9KksTjV4goIOQ1HpvNrvFIwjx4rI2Rew9PmfUgdh3a4nezpdmYgiW5RTxwkogumXxemz0Egids//rscDjQfPY0gMhb4ymzHsQrpWv7XKfcam/BK6VrUWY9qNHIiChcycFj67RpPJIwDp7a2loAQIwuFgmxiRqPJnAkScKuQ1sGfGbXoa2QJEmdARFRRNB3by6wd7LiGbLe9/BEUg9PZXN5n0rnfK32M6hsLldpREQUCZSKx8aKZ8gqjkZmD0+7vTWgzxERAT272uw27Xe1hW3wHDviu4cn0k6lTjKaA/ocERHQK3jsnGobMvkenkgLnqzU7D7XJ5/PbLQgKzVbpRERUSQwMHgu34nuzQWWxMja0SaKIpbkFg34zJLc5eznIaJLIgdPl51TbUOm3MMTgT08Oel5WFHwSJ/Kx2y0YEXBI+zjIaJLZtB1H5kTAsETlg2kdrsdLW3NAABLhPXwyHLS8zB99GyeXEBEAaFMtfHInKGRe3hidXGIj0nQeDTBI4oiJo2YpvUwiCgCKBVPCARPWP71mffwEBFdGr3eV/E4HA6NRxKmwVNx1LeVOjk+MqfZiIgCTa54HA5WPEMi38MTqes7RESBJq/xsOIZoqrKagCRex0CEVGgyRfBOZyseIZEuYcnwppHiYiCRa9UPE6NRxKmwVPfZAUAWBI41UZENBjKVJtT+6m2sNtObbPZcLbdd3oz13hCC29MJQpd8rUITheD55KdOHECABCnN0Z0D0+44Y2pRKFNrnicIVDxhN1fR6urfRsLko2RdR1COOONqUShT17jcbq5xnPJjnffw5PCHp6QwBtTicKDXPG43C7N/3sMu+A5dkTu4eGOtlDAG1OJwoO8nRrQvpcn7IKnp4eHFU8o4I2pROFBnmoDtD+vLeyC50RtDQD28IQK3phKFB50og6i4PuWz+C5RPWN3T08nGoLCbwxlSh86ATfRmYGzyXo6OhAW0crACCFPTwhgTemEoUPvdh9CymDZ/DkHh6j3gRjTLzGoyEZb0wlCg/K9dcaB09YNZBWVVUBYA9PKOKNqUShL1QqnrAKnuNHKwEAKfEMnlDEG1OJQluoBE9Y/XW0Qu7h4Y42IqJLFipTbWEVPFVVvIeHiGio5IqHDaSXoKeHhzvaiIgulb77+mu73a7pOMIqeBqa6gGwh4eIaCgM3RWPzcbgGZT29na0d7YBYA8PEdFQyMfm2Dtsmo4jbIJH7uGJNyQgzmDUeDREROGHFc8lYg8PEdHlMegZPJekgvfwEBFdFvn6azuDZ3COH/E1j3JHGxHR0Mh9PAyeQVJ6eNg8SkQ0JAZlOzUbSAflRK1vcwErHiKioZF3tXWxj2dwGk5238PDioeIaEiUqTZWPBfX2tqKDts5AOzhISIaKoPeN9XGs9oGQe7hMRkSEauP03g0REThSc9DQgdP6eHhdQhEREMmT7U5GDwXJ1+HwB4eIqKhk3e1dTkYPBdVcVTu4eHGAiKioVIqHo2vRQiLG0irKn1TbdxKTZFIkiReGU6q0CvBw6uvL6rOWgsASOUFcBRhyqwHsevQFrTaW5TXzMYULMktQk56noYjo0hk6D4yx+HkRXAD8nq9aGjq7uHhPTwUQcqsB/FK6Vq/0AGAVnsLXildizLrQY1GRpFKmWpzOjUdR8gHT2trKzq7OgEAydxcQBFCkiTsOrRlwGd2HdoKSZLUGRBFBXmqzelixTOg6mrfGW0JMUmI6W5+Igp3lc3lfSqd87Xaz6CyuVylEVE0MCjBw4pnQHLw8B4eiiTt9taAPkc0GPK1CAyei6go9/XwcH2HIkmS0RzQ54gGw9Brqs3r9Wo2jtAPnmPdzaM8o40iSFZqNszGlAGfMRstyErNVmlEFA3kNR4AcGq4wSDkg6e6svseHm6lpggiiiKW5BYN+MyS3OXs56GAkrdTA9qe1xbyX9W1cg8PTy2gCJOTnocVBY/0qXzMRgtWFDzCPh4KOJ2ogwABgLbBE9INpF6vFw0n6wHw1AKKTDnpeZg+ejZPLiBVCIIAvWiAS3IyeC6kpaUFdocNAE+mpsgliiImjZim9TAoSoRC8IT0X6vkrdSJMcOUU1WJiGjo9KKv3mDwXEBVVXcPD08sICIKCL1O+1tIQzp4KsorAAAWBg8RUUAYRO1vIQ3p4Dl+jPfwEBEFko5TbQOrrpJ7eFjxEBEFAiuei6it9/XwsOIhIgoM+fQCu92u2RhCNni8Xi8a5R4entNGRBQQ8nlt9k4GTx/Nzc3ocnZBgABzvEXr4RARRQT5hGqbjcHTh9LDE2tWEpqIiC6P/P3U1mnTbAwhGzxyD08KTywgIgoYZY2HFU9fcg9PSjzXd4iIAkXe1cbg6UdPDw+3UhMRBYp8/Jjdzu3UfchrPLyHh4gocOSpti5up+6rzir38LDiISIKFINenmpjxePH6/Wi4VQDAPbwEBEFkjLVxpML/J06dQpOl8PXw2NkDw8RUaDI26m7ujjV5kde30mKS4ZeF9J31RERhZWeaxEcmo0hJIOnqqoKAJBiZA8PEVEgxeh5SGi/jpUfBwCkcH2HiCig5CNzHA4Gj59K9vAQEQWFQd891ebgVJsfpYeH1yEQEQWUfHIBK57z1FnrAACpbB4lIgoouYHU4WTFo5AkCY2nfT08KSZOtRERBZK+u+JxMnh6NDU1weV2QoTIHh4iogAzsOLpq6amBoCvh0cn6rQdDBFRhJGDx+l0ajaGkAueqsruHp54TrMREQWavMbjdLHiURyT7+Hh+g4RUcAZuvt4nG4nvF6vJmMIueDhPTxERMEjVzxerxcul0ubMWjyqQOQ13guZSu1JEmobC5Hu70VSUYzslKzIYohl6lERJqT13gA37E5MTExqo8h5IKnrt7Xw2MxjRzU82XWg9h1aAta7S3Ka2ZjCpbkFiEnPS8oYyQiClfydmrAFzxJSUmqjyGkygJJktB0CT08ZdaDeKV0rV/oAECrvQWvlK5FmfVgUMZJRBSuBEGAXvTVHA6Njs0JqeBpaGiA2+OGKOgwzJg84LOSJGHXoS0DPrPr0FZIkhTAERIRhT+56tHqhOqQCh55fWdYXMpFe3gqm8v7VDrna7WfQWVzeaCGR0QUERg8vVQdH3wPT7u9dVDvOdjniIiiBYOnF/keHovp4hfAJRnNg3rPwT5HRBQtDAyeHscrBn8BXFZqNszGlAGfMRstyErNDsjYiIgihdzLw+DBpfXwiKKIJblFAz6zJHc5+3mIiM7DqbZelB6eQV4Al5OehxUFj/SpfMxGC1YUPMI+HiKifhh03beQahQ8IdNA6vF4cLK5EcClndOWk56H6aNn8+QCIqJBkisem82mzedr8qn9qK+vh0fyQCfoMCxu4B6e84miiEkjpgVpZEREkUU+NsfWYdfk80OmLOjp4bGwWiEiCiJ5c4HdFuXBU3kJPTxERDR0ylRbpzZTbSETPBXd9/BYeA8PEVFQGVjx+PAeHiIidSjBY4/y7dQ1J2oAAJZLuIeHiIgunb57O7Ut2isea8Ol9fAQEdHQyBVPlz2Kg8ftduPkmZMAuMZDRBRsBh6ZA1itVkiSB3pRj8Q4s9bDISKKaPJUW1Sv8cg9POa4VIhCSAyJiChiseJBTw9PcvzFr0MgIqLLY9Bre1ZbSATPMfbwEBGpRq54nE6HJp8fEsHDHh4iIvVofTp1SATPie4entTEkdoOhIgoCsgVjyOaKx5rgxXA4G4eJSKiy6MXfRWPwxGlweNyuXC6hT08RERqifqKp66uDpJXgl40IDFumNbDISKKePpo31wg9/AkG1MhCIK2gyEiigLy5gKHK0qDp7LCt6MthT08RESqMHTfx+N0OTX5fM2D5+hhXw8PL4AjIlKHMtUWrcFTVek7tYDXIRARqUPeXCBJHrjdbtU/X/Pgqak5AQBIZfAQEalCvvoa0KaJVPPgqW/svoeHPTxERKqI6uBxOBw4ffYUACCFPTxERKoQRRE6QQcgCoOnrq4OXq8XBjEGCbFJWg6FiCiqyFVP1AUPe3iIiLQRtcEjn0rNrdREROqK2uCR7+Hh+g4Rkbr0Gt5CqmnwVHXfPMp7eIiI1GWI1ornRK3cw8N7eIiI1BS1FY9V7uFhxUNEpCq54tHiTh7NgqerqwvNZ08D4BoPEZHa5IrHZrOp/tmaBU9tbS0AIEYXC1NMolbDICKKSvItpPZOu+qfrVnwsIeHiEg78kGhtmgKHvbwEBFpp2eqLYqC52j5MQBc3yEi0oJc8dijKXiqjlcDACwJPJWaiEhtBnmNJ7o2F/AeHiIirchTbXZ7FPXxWButAHgPDxGRFgy67orHHiVTbXa7HS1tzQC4xkNEpAVDtFU8J074ptlidUbEx5i0GAIRUVRTjsyJluBhDw8RkbYM0XZW2/GjxwEAKaZULT6eiCjqGfS+NZ6oCZ6j3ffwWLi+Q0SkCbnicTiiJHiqKrt7eHgdAhGRJuRdbV1dUXI6tdzDw+sQiIi0oVQ8ziipeJR7eNjDQ0SkCb0uiu7j6ezsROu5swDYw0NEpBX5yByHMwqCR+7hidPHs4eHiEgjcsXjjIbgqa72bSxINnIrNRGRVnrWeKIgeCrkHh7ew0NEpBm54nG5Xap/tvrBc8QXPNzRRkSkHXmNx+mKgopH6eHhPTxERJqRp9rcHjc8Ho+qn6168NTWsYeHiEhr8lQboP6WatWDR+nhYcVDRKQZvdgTPGqf16Zq8Jw7dw7tHW0A2MNDRKQlnaiDKOgARHjwyD08Rr0JRkO8mh9NRETn0Yt6ABEePHIPT0o8e3iIiLQmT7dFdPDIW6mT2cNDRKQ5Q6QHj8fjwb69fwUA6EQRkiSp9dFERNQPXSQHT0lJCTIzM/HOn/4IAChrOIgn3v1XlFkPqvHxRETUj4iteEpKSrB06VJYrVa/11vtLXildC3Dh4hII3IvT0QFj8fjwapVq+D1ei/4zK5DWzntRkSkgYjcXLB///4+lc75Wu1nUNlcHsxhEBFRP+Rjc2w2u6qfG9TgaWxsHNRz7fbWYA6DiIj6IVc89kgKnrS0tEE9l2Q0B3MYRETUD4POd0K1rdOm6ucGNXjmzZuH9PR0CIJwwWfMRguyUrODOQwiIuqHvLnA3hlBFY9Op0NxcTEAXDB8luQuhyiqflYpEVHU61njiaCKBwAWL16MnTt3YsyYMX6vm40WrCh4BDnpecEeAhER9UOearPbImhXm2zx4sWoqanB1MlXAgC+c8X38MStzzN0iIg0pPTx2CMweADftFvm2PEAgITYYZxeIyLSmDzVZrdH0BrP+SyWFABAp+Ocmh9LRET9METiyQXnGz7Cdyp1p6NDzY8lIqJ+KGs8kTrVBgDDR/ru4bExeIiINNdT8UTwVNvwUd0Vj5PBQ0SkNbni6epyqPq5qgbPiO6pNpuLwUNEpDW9PgrWeFJSfJsLbM5ONT+WiIj6IVc8DkcEB4/FYgHAioeIKBTIazwORwRPtckVT5fbxjt4iIg0Jp9O7XBGcPAkJycr/253cbqNiEhLUVHxGAwGmOJMAIBOJ5tIiYi0pBe713giueIBgKTEYQCATgcrHiIiLckVj9MV4cEzLMkMALCxl4eISFPyIaHOSK94Usw8r42IKBQoFY/bqernqh48ySkMHiKiUCCv8bjcLlV3GqsePD0nVHOqjYhIS3LFA6i7s0314Bk+wndQKIOHiEhbvYNHzWNz1A+ekfLVCJxqIyLSkijoIEAAEOHBM6I7eHheGxGRtgRBUE4viOjgGa4ED6faiIi0phybE8lrPMoJ1TwolIhIc1pcf61h8HCqjYhIa1Ex1SZfjdDltsEjedT+eCIi6iUqgocnVBMRhY6omGrT6/XKCdXcYEBEpK2oqHgAICnRDAD44sQnqDj1LS+FIyLSgCRJcEkuAMAXX3wBj0ed5Q/B6/V6VfmkbiUlJbjzjjvh9riV18zGFCzJLUJOep6aQyEiilpl1oPYdWgLWu0tymvp6ekoLi7G4sWLg/rZqgZPSUkJli5digt95IqCRxg+RERBVmY9iFdK1/Z5XRB8pxjs3LkzqOGjWvB4PB5kZmbCarVe8Bmz0YInbn0eoqjJDCARUcSTJAlPvPuvfpVOb4IgID09HdXV1dDpdEEZg2rBs2/fPhQWFvq9tgrAo+c9ZzIkQCcaQEREgeeRXOjs1cD/7wDeBPAQgPW9ntu7dy8WLFgQlDHog/Ku/WhsbOzzmhtA+vkv8kQDIqKgSu7175bu/40575n+vmcHimrBk5aW5vfjFwHkADh/4m14aipiY2PVGhYRUVRxOBw43dys/PhOADcAiAXwXK/nzv+eHUiqr/HU19f3u7lAjXlFIqJoFwrfi1VbxdfpdCguLgbQs3NCJv943bp1DB0ioiAKhe/Fqm4fW7x4MXbu3IkxY8b4vZ6enh707XtEROSj9fdi1RtIAV+pt3//fjQ2NiItLQ3z5s1jpUNEpDKtvhdrEjxERBS92KlJRESqYvAQEZGqGDxERKQqBg8REamKwUNERKpi8BARkaoYPEREpCoGDxERqYrBQ0REqmLwEBGRqhg8RESkKgYPERGpisFDRESqYvAQEZGqGDxERKQqBg8REamKwUNERKpi8BARkaoYPEREpCoGDxERqer/AyHglQW884QBAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from scipy.spatial import ConvexHull\n",
    "\n",
    "def generate_polygon_with_external_fixed_edge(fixed_edge, num_points=20):\n",
    "    \"\"\"\n",
    "    随机生成一个多边形，固定边在多边形外部\n",
    "    :param fixed_edge: 固定边的两个顶点，例如 [(x1, y1), (x2, y2)]\n",
    "    :param num_points: 除固定边外的随机顶点数量\n",
    "    \"\"\"\n",
    "    # 转换固定边为 NumPy 数组\n",
    "    fixed_edge = np.array(fixed_edge)\n",
    "    p1, p2 = fixed_edge[0], fixed_edge[1]\n",
    "    \n",
    "    # 计算固定边的方向和垂直方向\n",
    "    edge_vector = p2 - p1\n",
    "    perpendicular_vector = np.array([-edge_vector[1], edge_vector[0]])  # 垂直方向\n",
    "    \n",
    "    # 在固定边的外侧生成随机点\n",
    "    random_points = []\n",
    "    for _ in range(num_points):\n",
    "        t = np.random.uniform(-0.2, 1.2)  # 延固定边方向稍微扩展范围\n",
    "        random_point_on_edge = p1 + t * edge_vector  # 固定边上的随机点\n",
    "        random_offset = np.random.uniform(0.1, 1) * perpendicular_vector  # 外侧偏移\n",
    "        random_points.append(random_point_on_edge + random_offset)\n",
    "    \n",
    "    random_points = np.array(random_points)\n",
    "    \n",
    "    # 合并固定边的两个点和随机生成的点\n",
    "    all_points = np.vstack([fixed_edge, random_points])\n",
    "    \n",
    "    # 使用凸包算法生成多边形\n",
    "    hull = ConvexHull(all_points)\n",
    "    polygon_points = all_points[hull.vertices]  # 获取凸包顶点的坐标\n",
    "    \n",
    "    # 生成随机颜色\n",
    "    color = np.random.rand(3)\n",
    "    \n",
    "    # 绘制多边形\n",
    "    plt.fill(polygon_points[:, 0], polygon_points[:, 1], color=color, alpha=0.8)\n",
    "    \n",
    "    # 绘制固定边\n",
    "    plt.plot(fixed_edge[:, 0], fixed_edge[:, 1], 'r-', lw=2, label='Fixed Edge')  # 固定边用红色表示\n",
    "    \n",
    "    # 绘制顶点和轮廓\n",
    "    plt.plot(polygon_points[:, 0], polygon_points[:, 1], 'k-', lw=1.5, label='Polygon Edges')  # 多边形轮廓\n",
    "    plt.scatter(all_points[:, 0], all_points[:, 1], color='black')  # 所有顶点\n",
    "    \n",
    "    # 设置图形显示\n",
    "    plt.gca().set_aspect('equal')\n",
    "    plt.axis('off')\n",
    "    plt.legend()\n",
    "    plt.show()\n",
    "\n",
    "# 固定一条边的两个点\n",
    "fixed_edge = [(0.2, 0.2), (0.8, 0.2)]\n",
    "\n",
    "# 调用函数生成包含固定外部边的多边形\n",
    "#generate_polygon_with_external_fixed_edge(fixed_edge=fixed_edge, num_points=10)\n",
    "\n",
    "\"\"\"\n",
    "随机生成一个多边形，固定边在多边形外部\n",
    ":param fixed_edge: 固定边的两个顶点，例如 [(x1, y1), (x2, y2)]\n",
    ":param num_points: 除固定边外的随机顶点数量\n",
    "\"\"\"\n",
    "# 转换固定边为 NumPy 数组\n",
    "fixed_edge = np.array(fixed_edge)\n",
    "p1, p2 = fixed_edge[0], fixed_edge[1]\n",
    "num_points=10\n",
    "# 计算固定边的方向和垂直方向\n",
    "edge_vector = p2 - p1\n",
    "perpendicular_vector = np.array([-edge_vector[1], edge_vector[0]])  # 垂直方向\n",
    "\n",
    "# 在固定边的外侧生成随机点\n",
    "random_points = []\n",
    "for _ in range(num_points):\n",
    "    t = np.random.uniform(-0.2, 1.2)  # 延固定边方向稍微扩展范围\n",
    "    random_point_on_edge = p1 + t * edge_vector  # 固定边上的随机点\n",
    "    random_offset = np.random.uniform(0.1, 1) * perpendicular_vector  # 外侧偏移\n",
    "    random_points.append(random_point_on_edge + random_offset)\n",
    "\n",
    "random_points = np.array(random_points)\n",
    "\n",
    "# 合并固定边的两个点和随机生成的点\n",
    "all_points = np.vstack([fixed_edge, random_points])\n",
    "\n",
    "# 使用凸包算法生成多边形\n",
    "hull = ConvexHull(all_points)\n",
    "polygon_points = all_points[hull.vertices]  # 获取凸包顶点的坐标\n",
    "\n",
    "# 生成随机颜色\n",
    "color = np.random.rand(3)\n",
    "\n",
    "# 绘制多边形\n",
    "plt.fill(polygon_points[:, 0], polygon_points[:, 1], color=color, alpha=0.8)\n",
    "\n",
    "# 绘制固定边\n",
    "plt.plot(fixed_edge[:, 0], fixed_edge[:, 1], 'r-', lw=2, label='Fixed Edge')  # 固定边用红色表示\n",
    "\n",
    "# 绘制顶点和轮廓\n",
    "plt.plot(polygon_points[:, 0], polygon_points[:, 1], 'k-', lw=1.5, label='Polygon Edges')  # 多边形轮廓\n",
    "plt.scatter(all_points[:, 0], all_points[:, 1], color='black')  # 所有顶点\n",
    "\n",
    "# 设置图形显示\n",
    "plt.gca().set_aspect('equal')\n",
    "plt.axis('off')\n",
    "plt.legend()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 446,
   "metadata": {},
   "outputs": [],
   "source": [
    "def constrained_triangulation(polygon_points):\n",
    "    vertices = np.array(polygon_points)\n",
    "    # 定义约束边，保持多边形的边界不被破坏\n",
    "    segments = np.array([[i, (i + 1) % len(vertices)] for i in range(len(vertices))])\n",
    "    \n",
    "    # 使用 triangle 库进行带约束的三角剖分\n",
    "    A = dict(vertices=vertices, segments=segments)\n",
    "    triangulation = triangle.triangulate(A, 'p')\n",
    "    \n",
    "    return triangulation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 447,
   "metadata": {},
   "outputs": [],
   "source": [
    "def export_to_obj(triangulation, filename=\"polygon_triangulated.obj\"):\n",
    "    vertices = triangulation['vertices']\n",
    "    triangles = triangulation['triangles']\n",
    "    \n",
    "    with open(filename, 'w') as f:\n",
    "        # 写入顶点信息\n",
    "        for v in vertices:\n",
    "            f.write(f\"v {v[0]} {v[1]} 0.0\\n\")  # z 设为 0 表示在二维平面上\n",
    "        \n",
    "        # 写入面（每个面由3个顶点构成）\n",
    "        for tri in triangles:\n",
    "            # OBJ 索引从1开始，因此要加1\n",
    "            f.write(f\"f {tri[0] + 1} {tri[1] + 1} {tri[2] + 1}\\n\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 448,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_obj_in_jupyter(obj_filename):\n",
    "    # 使用trimesh加载OBJ文件\n",
    "    mesh = trimesh.load(obj_filename)\n",
    "    \n",
    "    # 获取顶点和面数据\n",
    "    vertices = mesh.vertices\n",
    "    faces = mesh.faces\n",
    "    \n",
    "    # 创建Plotly图形对象\n",
    "    mesh_plot = go.Mesh3d(\n",
    "        x=vertices[:, 0],\n",
    "        y=vertices[:, 1],\n",
    "        z=vertices[:, 2],\n",
    "        i=faces[:, 0],\n",
    "        j=faces[:, 1],\n",
    "        k=faces[:, 2],\n",
    "        opacity=0.5,\n",
    "        color='lightblue'\n",
    "    )\n",
    "    \n",
    "    # 设置布局\n",
    "    layout = go.Layout(\n",
    "        scene=dict(\n",
    "            xaxis=dict(visible=False),\n",
    "            yaxis=dict(visible=False),\n",
    "            zaxis=dict(visible=False)\n",
    "        ),\n",
    "        title=\"OBJ File Visualization\"\n",
    "    )\n",
    "    \n",
    "    # 创建并展示图像\n",
    "    fig = go.Figure(data=[mesh_plot], layout=layout)\n",
    "    fig.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 591,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.plotly.v1+json": {
       "config": {
        "plotlyServerURL": "https://plot.ly"
       },
       "data": [
        {
         "color": "lightblue",
         "i": [
          3,
          1,
          5,
          5
         ],
         "j": [
          1,
          3,
          0,
          1
         ],
         "k": [
          2,
          4,
          1,
          4
         ],
         "opacity": 0.5,
         "type": "mesh3d",
         "x": [
          33.093917145542235,
          4.98765877090019,
          -23.517454111626957,
          -24.7,
          24.7,
          32.39872478663868
         ],
         "y": [
          66.68509719142656,
          68.60183901077852,
          59.814728726052344,
          20.5,
          20.5,
          49.84150173087049
         ],
         "z": [
          0,
          0,
          0,
          0,
          0,
          0
         ]
        }
       ],
       "layout": {
        "scene": {
         "xaxis": {
          "visible": false
         },
         "yaxis": {
          "visible": false
         },
         "zaxis": {
          "visible": false
         }
        },
        "template": {
         "data": {
          "bar": [
           {
            "error_x": {
             "color": "#2a3f5f"
            },
            "error_y": {
             "color": "#2a3f5f"
            },
            "marker": {
             "line": {
              "color": "#E5ECF6",
              "width": 0.5
             },
             "pattern": {
              "fillmode": "overlay",
              "size": 10,
              "solidity": 0.2
             }
            },
            "type": "bar"
           }
          ],
          "barpolar": [
           {
            "marker": {
             "line": {
              "color": "#E5ECF6",
              "width": 0.5
             },
             "pattern": {
              "fillmode": "overlay",
              "size": 10,
              "solidity": 0.2
             }
            },
            "type": "barpolar"
           }
          ],
          "carpet": [
           {
            "aaxis": {
             "endlinecolor": "#2a3f5f",
             "gridcolor": "white",
             "linecolor": "white",
             "minorgridcolor": "white",
             "startlinecolor": "#2a3f5f"
            },
            "baxis": {
             "endlinecolor": "#2a3f5f",
             "gridcolor": "white",
             "linecolor": "white",
             "minorgridcolor": "white",
             "startlinecolor": "#2a3f5f"
            },
            "type": "carpet"
           }
          ],
          "choropleth": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "type": "choropleth"
           }
          ],
          "contour": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "contour"
           }
          ],
          "contourcarpet": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "type": "contourcarpet"
           }
          ],
          "heatmap": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "heatmap"
           }
          ],
          "heatmapgl": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "heatmapgl"
           }
          ],
          "histogram": [
           {
            "marker": {
             "pattern": {
              "fillmode": "overlay",
              "size": 10,
              "solidity": 0.2
             }
            },
            "type": "histogram"
           }
          ],
          "histogram2d": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "histogram2d"
           }
          ],
          "histogram2dcontour": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "histogram2dcontour"
           }
          ],
          "mesh3d": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "type": "mesh3d"
           }
          ],
          "parcoords": [
           {
            "line": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "parcoords"
           }
          ],
          "pie": [
           {
            "automargin": true,
            "type": "pie"
           }
          ],
          "scatter": [
           {
            "fillpattern": {
             "fillmode": "overlay",
             "size": 10,
             "solidity": 0.2
            },
            "type": "scatter"
           }
          ],
          "scatter3d": [
           {
            "line": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scatter3d"
           }
          ],
          "scattercarpet": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scattercarpet"
           }
          ],
          "scattergeo": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scattergeo"
           }
          ],
          "scattergl": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scattergl"
           }
          ],
          "scattermapbox": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scattermapbox"
           }
          ],
          "scatterpolar": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scatterpolar"
           }
          ],
          "scatterpolargl": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scatterpolargl"
           }
          ],
          "scatterternary": [
           {
            "marker": {
             "colorbar": {
              "outlinewidth": 0,
              "ticks": ""
             }
            },
            "type": "scatterternary"
           }
          ],
          "surface": [
           {
            "colorbar": {
             "outlinewidth": 0,
             "ticks": ""
            },
            "colorscale": [
             [
              0,
              "#0d0887"
             ],
             [
              0.1111111111111111,
              "#46039f"
             ],
             [
              0.2222222222222222,
              "#7201a8"
             ],
             [
              0.3333333333333333,
              "#9c179e"
             ],
             [
              0.4444444444444444,
              "#bd3786"
             ],
             [
              0.5555555555555556,
              "#d8576b"
             ],
             [
              0.6666666666666666,
              "#ed7953"
             ],
             [
              0.7777777777777778,
              "#fb9f3a"
             ],
             [
              0.8888888888888888,
              "#fdca26"
             ],
             [
              1,
              "#f0f921"
             ]
            ],
            "type": "surface"
           }
          ],
          "table": [
           {
            "cells": {
             "fill": {
              "color": "#EBF0F8"
             },
             "line": {
              "color": "white"
             }
            },
            "header": {
             "fill": {
              "color": "#C8D4E3"
             },
             "line": {
              "color": "white"
             }
            },
            "type": "table"
           }
          ]
         },
         "layout": {
          "annotationdefaults": {
           "arrowcolor": "#2a3f5f",
           "arrowhead": 0,
           "arrowwidth": 1
          },
          "autotypenumbers": "strict",
          "coloraxis": {
           "colorbar": {
            "outlinewidth": 0,
            "ticks": ""
           }
          },
          "colorscale": {
           "diverging": [
            [
             0,
             "#8e0152"
            ],
            [
             0.1,
             "#c51b7d"
            ],
            [
             0.2,
             "#de77ae"
            ],
            [
             0.3,
             "#f1b6da"
            ],
            [
             0.4,
             "#fde0ef"
            ],
            [
             0.5,
             "#f7f7f7"
            ],
            [
             0.6,
             "#e6f5d0"
            ],
            [
             0.7,
             "#b8e186"
            ],
            [
             0.8,
             "#7fbc41"
            ],
            [
             0.9,
             "#4d9221"
            ],
            [
             1,
             "#276419"
            ]
           ],
           "sequential": [
            [
             0,
             "#0d0887"
            ],
            [
             0.1111111111111111,
             "#46039f"
            ],
            [
             0.2222222222222222,
             "#7201a8"
            ],
            [
             0.3333333333333333,
             "#9c179e"
            ],
            [
             0.4444444444444444,
             "#bd3786"
            ],
            [
             0.5555555555555556,
             "#d8576b"
            ],
            [
             0.6666666666666666,
             "#ed7953"
            ],
            [
             0.7777777777777778,
             "#fb9f3a"
            ],
            [
             0.8888888888888888,
             "#fdca26"
            ],
            [
             1,
             "#f0f921"
            ]
           ],
           "sequentialminus": [
            [
             0,
             "#0d0887"
            ],
            [
             0.1111111111111111,
             "#46039f"
            ],
            [
             0.2222222222222222,
             "#7201a8"
            ],
            [
             0.3333333333333333,
             "#9c179e"
            ],
            [
             0.4444444444444444,
             "#bd3786"
            ],
            [
             0.5555555555555556,
             "#d8576b"
            ],
            [
             0.6666666666666666,
             "#ed7953"
            ],
            [
             0.7777777777777778,
             "#fb9f3a"
            ],
            [
             0.8888888888888888,
             "#fdca26"
            ],
            [
             1,
             "#f0f921"
            ]
           ]
          },
          "colorway": [
           "#636efa",
           "#EF553B",
           "#00cc96",
           "#ab63fa",
           "#FFA15A",
           "#19d3f3",
           "#FF6692",
           "#B6E880",
           "#FF97FF",
           "#FECB52"
          ],
          "font": {
           "color": "#2a3f5f"
          },
          "geo": {
           "bgcolor": "white",
           "lakecolor": "white",
           "landcolor": "#E5ECF6",
           "showlakes": true,
           "showland": true,
           "subunitcolor": "white"
          },
          "hoverlabel": {
           "align": "left"
          },
          "hovermode": "closest",
          "mapbox": {
           "style": "light"
          },
          "paper_bgcolor": "white",
          "plot_bgcolor": "#E5ECF6",
          "polar": {
           "angularaxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           },
           "bgcolor": "#E5ECF6",
           "radialaxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           }
          },
          "scene": {
           "xaxis": {
            "backgroundcolor": "#E5ECF6",
            "gridcolor": "white",
            "gridwidth": 2,
            "linecolor": "white",
            "showbackground": true,
            "ticks": "",
            "zerolinecolor": "white"
           },
           "yaxis": {
            "backgroundcolor": "#E5ECF6",
            "gridcolor": "white",
            "gridwidth": 2,
            "linecolor": "white",
            "showbackground": true,
            "ticks": "",
            "zerolinecolor": "white"
           },
           "zaxis": {
            "backgroundcolor": "#E5ECF6",
            "gridcolor": "white",
            "gridwidth": 2,
            "linecolor": "white",
            "showbackground": true,
            "ticks": "",
            "zerolinecolor": "white"
           }
          },
          "shapedefaults": {
           "line": {
            "color": "#2a3f5f"
           }
          },
          "ternary": {
           "aaxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           },
           "baxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           },
           "bgcolor": "#E5ECF6",
           "caxis": {
            "gridcolor": "white",
            "linecolor": "white",
            "ticks": ""
           }
          },
          "title": {
           "x": 0.05
          },
          "xaxis": {
           "automargin": true,
           "gridcolor": "white",
           "linecolor": "white",
           "ticks": "",
           "title": {
            "standoff": 15
           },
           "zerolinecolor": "white",
           "zerolinewidth": 2
          },
          "yaxis": {
           "automargin": true,
           "gridcolor": "white",
           "linecolor": "white",
           "ticks": "",
           "title": {
            "standoff": 15
           },
           "zerolinecolor": "white",
           "zerolinewidth": 2
          }
         }
        },
        "title": {
         "text": "OBJ File Visualization"
        }
       }
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "多边形的面积为: 2454.982965542049\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\n",
    "随机生成一个多边形，固定边在多边形外部\n",
    ":param fixed_edge: 固定边的两个顶点，例如 [(x1, y1), (x2, y2)]\n",
    ":param num_points: 除固定边外的随机顶点数量\n",
    "\"\"\"\n",
    "fixed_edge = [(-24.7, 20.5), (24.7, 20.5)]\n",
    "# 转换固定边为 NumPy 数组\n",
    "fixed_edge = np.array(fixed_edge)\n",
    "p1, p2 = fixed_edge[0], fixed_edge[1]\n",
    "num_points=10\n",
    "# 计算固定边的方向和垂直方向\n",
    "edge_vector = p2 - p1\n",
    "perpendicular_vector = np.array([-edge_vector[1], edge_vector[0]])  # 垂直方向\n",
    "\n",
    "# 在固定边的外侧生成随机点\n",
    "random_points = []\n",
    "for _ in range(num_points):\n",
    "    t = np.random.uniform(-0.2, 1.2)  # 延固定边方向稍微扩展范围\n",
    "    random_point_on_edge = p1 + t * edge_vector  # 固定边上的随机点\n",
    "    random_offset = np.random.uniform(0.1, 1) * perpendicular_vector  # 外侧偏移\n",
    "    random_points.append(random_point_on_edge + random_offset)\n",
    "\n",
    "random_points = np.array(random_points)\n",
    "\n",
    "# 合并固定边的两个点和随机生成的点\n",
    "all_points = np.vstack([fixed_edge, random_points])\n",
    "\n",
    "# 使用凸包算法生成多边形\n",
    "hull = ConvexHull(all_points)\n",
    "polygon_points = all_points[hull.vertices]  # 获取凸包顶点的坐标\n",
    "\n",
    "# 生成随机颜色\n",
    "color = np.random.rand(3)\n",
    "\n",
    "# 绘制多边形\n",
    "plt.fill(polygon_points[:, 0], polygon_points[:, 1], color=color, alpha=0.8)\n",
    "\n",
    "# 绘制固定边\n",
    "plt.plot(fixed_edge[:, 0], fixed_edge[:, 1], 'r-', lw=2, label='Fixed Edge')  # 固定边用红色表示\n",
    "\n",
    "# 绘制顶点和轮廓\n",
    "plt.plot(polygon_points[:, 0], polygon_points[:, 1], 'k-', lw=1.5, label='Polygon Edges')  # 多边形轮廓\n",
    "plt.scatter(all_points[:, 0], all_points[:, 1], color='black')  # 所有顶点\n",
    "\n",
    "# 设置图形显示\n",
    "plt.gca().set_aspect('equal')\n",
    "plt.axis('off')\n",
    "plt.legend()\n",
    "plt.show()\n",
    "\n",
    "# 路径\n",
    "file='../../data/Refpa/'\n",
    "\n",
    "path = os.getcwd()\n",
    "filename = '../cst/Refpa.cst'\n",
    "fullname = os.path.join(path,filename)\n",
    "file_obj=file+'data'+str(i)+'.obj'\n",
    "file_s2p=file+'data'+str(i)\n",
    "\n",
    "\n",
    "\n",
    "# 进行带约束的三角剖分\n",
    "triangulation = constrained_triangulation(polygon_points)\n",
    "\n",
    "# 导出为OBJ文件\n",
    "export_to_obj(triangulation,file_obj)\n",
    "\n",
    "plot_obj_in_jupyter(file_obj)\n",
    "\n",
    "area = calculate_polygon_area(polygon_points)\n",
    "print(f\"多边形的面积为: {area}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 572,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "多边形的面积为: 0.18676455622802468\n"
     ]
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from scipy.spatial import ConvexHull\n",
    "\n",
    "def generate_polygon_with_external_fixed_edge(fixed_edge, num_points=8):\n",
    "    \"\"\"\n",
    "    随机生成一个多边形，固定边在多边形外部\n",
    "    :param fixed_edge: 固定边的两个顶点，例如 [(x1, y1), (x2, y2)]\n",
    "    :param num_points: 除固定边外的随机顶点数量\n",
    "    :return: 多边形的顶点坐标\n",
    "    \"\"\"\n",
    "    # 转换固定边为 NumPy 数组\n",
    "    fixed_edge = np.array(fixed_edge)\n",
    "    p1, p2 = fixed_edge[0], fixed_edge[1]\n",
    "    \n",
    "    # 计算固定边的方向和垂直方向\n",
    "    edge_vector = p2 - p1\n",
    "    perpendicular_vector = np.array([-edge_vector[1], edge_vector[0]])  # 垂直方向\n",
    "    \n",
    "    # 在固定边的外侧生成随机点\n",
    "    random_points = []\n",
    "    for _ in range(num_points):\n",
    "        t = np.random.uniform(-0.2, 1.2)  # 延固定边方向稍微扩展范围\n",
    "        random_point_on_edge = p1 + t * edge_vector  # 固定边上的随机点\n",
    "        random_offset = np.random.uniform(0.1, 0.5) * perpendicular_vector  # 外侧偏移\n",
    "        random_points.append(random_point_on_edge + random_offset)\n",
    "    \n",
    "    random_points = np.array(random_points)\n",
    "    \n",
    "    # 合并固定边的两个点和随机生成的点\n",
    "    all_points = np.vstack([fixed_edge, random_points])\n",
    "    \n",
    "    # 使用凸包算法生成多边形\n",
    "    hull = ConvexHull(all_points)\n",
    "    polygon_points = all_points[hull.vertices]  # 获取凸包顶点的坐标\n",
    "    \n",
    "    # 生成随机颜色\n",
    "    color = np.random.rand(3)\n",
    "    \n",
    "    # 绘制多边形\n",
    "    plt.fill(polygon_points[:, 0], polygon_points[:, 1], color=color, alpha=0.8)\n",
    "    \n",
    "    # 绘制固定边\n",
    "    plt.plot(fixed_edge[:, 0], fixed_edge[:, 1], 'r-', lw=2, label='Fixed Edge')  # 固定边用红色表示\n",
    "    \n",
    "    # 绘制顶点和轮廓\n",
    "    plt.plot(polygon_points[:, 0], polygon_points[:, 1], 'k-', lw=1.5, label='Polygon Edges')  # 多边形轮廓\n",
    "    plt.scatter(all_points[:, 0], all_points[:, 1], color='black')  # 所有顶点\n",
    "    \n",
    "    # 设置图形显示\n",
    "    plt.gca().set_aspect('equal')\n",
    "    plt.axis('off')\n",
    "    plt.legend()\n",
    "    plt.show()\n",
    "    \n",
    "    return polygon_points  # 返回多边形顶点坐标\n",
    "\n",
    "def calculate_polygon_area(polygon_points):\n",
    "    \"\"\"\n",
    "    使用多边形顶点计算面积（Shoelace公式）\n",
    "    :param polygon_points: 多边形顶点坐标\n",
    "    :return: 面积值\n",
    "    \"\"\"\n",
    "    n = len(polygon_points)\n",
    "    area = 0.0\n",
    "    for i in range(n):\n",
    "        x1, y1 = polygon_points[i]\n",
    "        x2, y2 = polygon_points[(i + 1) % n]  # 下一个顶点（循环）\n",
    "        area += x1 * y2 - y1 * x2\n",
    "    return abs(area) / 2.0\n",
    "\n",
    "# 固定一条边的两个点\n",
    "fixed_edge = [(0.2, 0.2), (0.8, 0.2)]\n",
    "\n",
    "# 生成多边形并获取顶点坐标\n",
    "polygon_points = generate_polygon_with_external_fixed_edge(fixed_edge=fixed_edge, num_points=10)\n",
    "\n",
    "# 计算面积\n",
    "area = calculate_polygon_area(polygon_points)\n",
    "print(f\"多边形的面积为: {area}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 362,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "def generate_nonconvex_polygon_with_external_fixed_edge(fixed_edge, num_points=8):\n",
    "    \"\"\"\n",
    "    随机生成一个非凸多边形，固定边在多边形外部\n",
    "    :param fixed_edge: 固定边的两个顶点，例如 [(x1, y1), (x2, y2)]\n",
    "    :param num_points: 除固定边外的随机顶点数量\n",
    "    \"\"\"\n",
    "    # 转换固定边为 NumPy 数组\n",
    "    fixed_edge = np.array(fixed_edge)\n",
    "    p1, p2 = fixed_edge[0], fixed_edge[1]\n",
    "    \n",
    "    # 计算固定边的方向和垂直方向\n",
    "    edge_vector = p2 - p1\n",
    "    perpendicular_vector = np.array([-edge_vector[1], edge_vector[0]])  # 垂直方向\n",
    "    \n",
    "    # 在固定边的外侧生成随机点\n",
    "    random_points = []\n",
    "    for _ in range(num_points):\n",
    "        t = np.random.uniform(-0.2, 1.2)  # 延固定边方向稍微扩展范围\n",
    "        random_point_on_edge = p1 + t * edge_vector  # 固定边上的随机点\n",
    "        random_offset = np.random.uniform(-0.5, 0.5) * perpendicular_vector  # 偏移（允许正负，增加非凸性）\n",
    "        random_points.append(random_point_on_edge + random_offset)\n",
    "    \n",
    "    random_points = np.array(random_points)\n",
    "    \n",
    "    # 合并固定边的两个点和随机生成的点\n",
    "    all_points = np.vstack([fixed_edge, random_points])\n",
    "    \n",
    "    # 对所有点按照极角排序，生成简单的非凸多边形\n",
    "    center = all_points.mean(axis=0)  # 计算所有点的中心\n",
    "    angles = np.arctan2(all_points[:, 1] - center[1], all_points[:, 0] - center[0])  # 计算极角\n",
    "    sorted_indices = np.argsort(angles)  # 按极角排序\n",
    "    polygon_points = all_points[sorted_indices]  # 按排序后的顺序排列顶点\n",
    "    \n",
    "    # 生成随机颜色\n",
    "    color = np.random.rand(3)\n",
    "    \n",
    "    # 绘制多边形\n",
    "    plt.fill(polygon_points[:, 0], polygon_points[:, 1], color=color, alpha=0.8)\n",
    "    \n",
    "    # 绘制固定边\n",
    "    plt.plot(fixed_edge[:, 0], fixed_edge[:, 1], 'r-', lw=2, label='Fixed Edge')  # 固定边用红色表示\n",
    "    \n",
    "    # 绘制顶点和轮廓\n",
    "    plt.plot(polygon_points[:, 0], polygon_points[:, 1], 'k-', lw=1.5, label='Polygon Edges')  # 多边形轮廓\n",
    "    plt.scatter(all_points[:, 0], all_points[:, 1], color='black')  # 所有顶点\n",
    "    \n",
    "    # 设置图形显示\n",
    "    plt.gca().set_aspect('equal')\n",
    "    plt.axis('off')\n",
    "    plt.legend()\n",
    "    plt.show()\n",
    "\n",
    "# 固定一条边的两个点\n",
    "fixed_edge = [(0.2, 0.2), (0.8, 0.2)]\n",
    "\n",
    "# 调用函数生成包含固定外部边的非凸多边形\n",
    "generate_nonconvex_polygon_with_external_fixed_edge(fixed_edge=fixed_edge, num_points=10)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 411,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "\n",
    "def generate_nonconvex_polygon_with_external_fixed_edge_from_regular_polygon(\n",
    "    num_sides=6, fixed_edge_index=0, num_points=8\n",
    "):\n",
    "    \"\"\"\n",
    "    随机生成一个非凸多边形，固定边是正多边形的某一条边，且在多边形外部\n",
    "    :param num_sides: 正多边形的边数（例如 6 表示正六边形）\n",
    "    :param fixed_edge_index: 指定正多边形中固定边的索引（0 表示第一条边）\n",
    "    :param num_points: 除固定边外的随机顶点数量\n",
    "    \"\"\"\n",
    "    # 生成正多边形的顶点\n",
    "    angles = np.linspace(0, 2 * np.pi, num_sides, endpoint=False)\n",
    "    polygon_vertices = np.array(\n",
    "        [(np.cos(a), np.sin(a)) for a in angles]\n",
    "    )  # 正多边形顶点坐标\n",
    "\n",
    "    # 提取固定边\n",
    "    fixed_edge = np.array(\n",
    "        [polygon_vertices[fixed_edge_index], polygon_vertices[(fixed_edge_index + 1) % num_sides]]\n",
    "    )\n",
    "    p1, p2 = fixed_edge[0], fixed_edge[1]\n",
    "\n",
    "    # 计算固定边的方向和垂直方向\n",
    "    edge_vector = p2 - p1\n",
    "    perpendicular_vector = np.array([-edge_vector[1], edge_vector[0]])  # 垂直方向\n",
    "\n",
    "    # 在固定边的外侧生成随机点\n",
    "    random_points = []\n",
    "    for _ in range(num_points):\n",
    "        t = np.random.uniform(-0.2, 1.2)  # 延固定边方向稍微扩展范围\n",
    "        random_point_on_edge = p1 + t * edge_vector  # 固定边上的随机点\n",
    "        random_offset = np.random.uniform(0.5, 1.0) * perpendicular_vector  # 外侧偏移\n",
    "        random_points.append(random_point_on_edge + random_offset)\n",
    "\n",
    "    random_points = np.array(random_points)\n",
    "\n",
    "    # 合并固定边的两个点和随机生成的点\n",
    "    all_points = np.vstack([polygon_vertices, random_points])\n",
    "\n",
    "    # 对所有点按照极角排序，生成简单的非凸多边形\n",
    "    center = all_points.mean(axis=0)  # 计算所有点的中心\n",
    "    angles = np.arctan2(all_points[:, 1] - center[1], all_points[:, 0] - center[0])  # 计算极角\n",
    "    sorted_indices = np.argsort(angles)  # 按极角排序\n",
    "    polygon_points = all_points[sorted_indices]  # 按排序后的顺序排列顶点\n",
    "\n",
    "    # 生成随机颜色\n",
    "    color = np.random.rand(3)\n",
    "\n",
    "    # 绘制多边形\n",
    "    plt.fill(polygon_points[:, 0], polygon_points[:, 1], color=color, alpha=0.8)\n",
    "\n",
    "    # 绘制固定边\n",
    "    plt.plot(\n",
    "        fixed_edge[:, 0],\n",
    "        fixed_edge[:, 1],\n",
    "        \"r-\",\n",
    "        lw=2,\n",
    "        label=\"Fixed Edge\",\n",
    "    )  # 固定边用红色表示\n",
    "\n",
    "    # 绘制顶点和轮廓\n",
    "    plt.plot(\n",
    "        polygon_points[:, 0],\n",
    "        polygon_points[:, 1],\n",
    "        \"k-\",\n",
    "        lw=1.5,\n",
    "        label=\"Polygon Edges\",\n",
    "    )  # 多边形轮廓\n",
    "    plt.scatter(all_points[:, 0], all_points[:, 1], color=\"black\")  # 所有顶点\n",
    "\n",
    "    # 设置图形显示\n",
    "    plt.gca().set_aspect(\"equal\")\n",
    "    plt.axis(\"off\")\n",
    "    plt.legend()\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "# 调用函数生成包含固定外部边的非凸多边形\n",
    "generate_nonconvex_polygon_with_external_fixed_edge_from_regular_polygon(\n",
    "    num_sides=6, fixed_edge_index=1, num_points=5\n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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vL298emnn9q83vTp0+9bp71l9HUnJCRg1qxZuX7O8PBwXLx40aYV2d27dzF//vz7Pja77+HNmzfT/duqUaMGACA+Pj7XtROR83FmlYgc6sEHH8TSpUvRsWNHPPTQQ6k7WGmahtOnT2Pp0qXw8PCwWSM6c+ZMNGzYENWqVUPPnj1Rrlw5XLlyBdu3b8eFCxfwzz//5KiGoKAgzJ49G507d0bNmjXRoUMHhISE4Ny5c1i7di0aNGiAzz77LMvnqFSpEsqXL49hw4bh4sWLCAoKwnfffZfhTGetWrUAAAMGDEB4eDg8PT3RoUMHNG7cGL1798akSZOwb98+tGjRAt7e3jh+/DhWrFiBGTNm4MUXX0RISAiGDRuGSZMmoXXr1mjZsiX27t2Ln376CYULF87R155X9evXR8GCBdG1a1cMGDAAFosFixcvztNp/d69e+Ozzz5Dx44dMXDgQBQrVgxLliyBn58fgMxnpgFk+z1ctGgRZs2aheeeew7ly5dHTEwM5s+fj6CgILRs2TLXtRORAkp6EBCR6Zw4cULr06ePVqFCBc3Pz0/z9/fXKlWqpL3xxhvavn370t3/5MmTWpcuXbTQ0FDN29tbK1GihNa6dWtt5cqVqfextlm6tz3Rli1b0rVAst4eHh6uBQcHa35+flr58uW1bt26aX///Xfqfbp27arly5cvw6/h0KFDWrNmzbT8+fNrhQsX1nr27Kn9888/6VpDJSUlaf3799dCQkI0i8WSro3VvHnztFq1amn+/v5aYGCgVq1aNW348OHapUuXUu+TnJysjR8/XitWrJjm7++vPfnkk9qBAwe00qVL2611VUZtnTJqXbVt2zatbt26mr+/v1a8eHFt+PDh2oYNG9K9x40bN9aqVKmS7jnvbT+laZp26tQprVWrVpq/v78WEhKiDR06VPvuu+80ANqOHTuyfKym3f893LNnj9axY0etVKlSmq+vr1akSBGtdevWNn/XROQaLJpmp1XvREREeTB9+nQMHjwYFy5csOn2QETmxrBKREROd+fOHZsLpO7evYtHH30UycnJOHbsmMLKiMhouGaViIic7vnnn0epUqVQo0YNREVF4euvv8aRI0cybUlFRObFsEpERE4XHh6Ozz//HEuWLEFycjIqV66MZcuWoX379qpLIyKD4TIAIiIiIjIs9lklIiIiIsNiWCUiIiIi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BUDTNMcV60b4M8Z+vvnmG3Tv3h3ffPMNWrVqpboctVRf4UV5s2zZMs3X11dbuHChdujQIa1Xr15agQIFtMjISE3TNK1z587ayJEjU++/bds2zcvLS5s6dap2+PBhLSIiQvP29tb279+v6kswhJy+jx988IHm4+OjrVy5Urt8+XLqR0xMjKovwRBy+j7ei90ARE7fx3PnzmmBgYFav379tKNHj2pr1qzRihQpor333nuqvgRDyOn7GBERoQUGBmrffPONdurUKe3nn3/Wypcvr7388suqvgTlYmJitL1792p79+7VAGgfffSRtnfvXu3s2bOapmnayJEjtc6dO6fe/9SpU1pAQID21ltvaYcPH9ZmzpypeXp6auvXr1f1JRhCTt/HJUuWaF5eXtrMmTNtfsbcunVL1ZegFMOqG/j000+1UqVKaT4+Plrt2rW1HTt2pP5Z48aNta5du9rc/9tvv9UqVqyo+fj4aFWqVNHWrl3r5IqNKSfvY+nSpTUA6T4iIiKcX7jB5PTfY1oMq7qcvo9//vmnVqdOHc3X11crV66c9v7772tJSUlOrtp4cvI+JiYmauPGjdPKly+v+fn5aWFhYdqbb76p3bx50/mFG8SWLVsy/F5nfd+6du2qNW7cON1jatSoofn4+GjlypXTvvzyS6fXbTQ5fR8bN26c5f3NxqJpPLdBRERERMbENatEREREZFgMq0RERERkWAyrRERERGRYDKtEREREZFgMq0RERERkWAyrRERERGRYDKtEREREZFgMq0RERERkWAyrRERERGRYDKtEREREZFgMq0RERERkWAyrRERERGRY/we3NJyxnh9nbgAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 800x800 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import random\n",
    "import numpy as np\n",
    "\n",
    "def generate_triangle(base_triangle, edge_index):\n",
    "    \"\"\"\n",
    "    Generate a new triangle from a given triangle and a specified edge.\n",
    "\n",
    "    Parameters:\n",
    "        base_triangle (list of tuple): The vertices of the current triangle [(x1, y1), (x2, y2), (x3, y3)].\n",
    "        edge_index (int): The index of the edge to use (0, 1, or 2).\n",
    "\n",
    "    Returns:\n",
    "        list of tuple: The vertices of the new triangle.\n",
    "    \"\"\"\n",
    "    # Extract the three vertices of the current triangle\n",
    "    p1, p2, p3 = base_triangle\n",
    "\n",
    "    # Determine the two vertices of the selected edge\n",
    "    if edge_index == 0:\n",
    "        edge_start, edge_end = p1, p2\n",
    "    elif edge_index == 1:\n",
    "        edge_start, edge_end = p2, p3\n",
    "    elif edge_index == 2:\n",
    "        edge_start, edge_end = p3, p1\n",
    "\n",
    "    # Calculate the midpoint of the edge\n",
    "    mid_x = (edge_start[0] + edge_end[0]) / 2\n",
    "    mid_y = (edge_start[1] + edge_end[1]) / 2\n",
    "\n",
    "    # Generate a new vertex (perpendicular outward from the edge)\n",
    "    dx = edge_end[1] - edge_start[1]  # Perpendicular vector x-component\n",
    "    dy = edge_start[0] - edge_end[0]  # Perpendicular vector y-component\n",
    "    scale = 0.5  # Controls the size of the new triangle\n",
    "\n",
    "    new_x = mid_x + scale * dx\n",
    "    new_y = mid_y + scale * dy\n",
    "\n",
    "    # Return the new triangle\n",
    "    return [edge_start, edge_end, (new_x, new_y)]\n",
    "\n",
    "\n",
    "def draw_triangles(base_triangle, num_iterations):\n",
    "    \"\"\"\n",
    "    Draw a series of triangles starting from an equilateral triangle.\n",
    "\n",
    "    Parameters:\n",
    "        base_triangle (list of tuple): Initial equilateral triangle vertices [(x1, y1), (x2, y2), (x3, y3)].\n",
    "        num_iterations (int): Number of triangles to generate.\n",
    "    \"\"\"\n",
    "    triangles = [base_triangle]\n",
    "\n",
    "    for _ in range(num_iterations):\n",
    "        # Randomly select an existing triangle\n",
    "        current_triangle = random.choice(triangles)\n",
    "\n",
    "        # Randomly select an edge (0, 1, 2)\n",
    "        edge_index = random.randint(0, 2)\n",
    "\n",
    "        # Generate a new triangle\n",
    "        new_triangle = generate_triangle(current_triangle, edge_index)\n",
    "\n",
    "        # Add it to the list\n",
    "        triangles.append(new_triangle)\n",
    "\n",
    "    # Draw all triangles\n",
    "    plt.figure(figsize=(8, 8))\n",
    "    for triangle in triangles:\n",
    "        x_coords = [p[0] for p in triangle] + [triangle[0][0]]  # Close the triangle\n",
    "        y_coords = [p[1] for p in triangle] + [triangle[0][1]]\n",
    "        plt.plot(x_coords, y_coords, 'b-')\n",
    "\n",
    "    plt.axis('equal')\n",
    "    plt.title('Generated Triangles')\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "# Initial equilateral triangle vertices\n",
    "initial_triangle = [(0, 0), (1, 0), (0.5, np.sqrt(3) / 2)]\n",
    "\n",
    "# Generate and draw the figure\n",
    "draw_triangles(initial_triangle, num_iterations=10)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import random\n",
    "import numpy as np\n",
    "def generate_triangle(base_triangle, edge_index):\n",
    "\"\"\"\n",
    "从给定的三角形和指定的边生成一个新的随机三角形。\n",
    "Parameters:\n",
    "    base_triangle (list of tuple): 当前三角形的三个顶点 [(x1, y1), (x2, y2), (x3, y3)]\n",
    "    edge_index (int): 指定边的索引 (0, 1 或 2)\n",
    "\n",
    "Returns:\n",
    "    list of tuple: 新的随机三角形顶点坐标\n",
    "\"\"\"\n",
    "# 取出当前三角形的三个顶点\n",
    "p1, p2, p3 = base_triangle\n",
    "\n",
    "# 确定所选边的两个顶点\n",
    "if edge_index == 0:\n",
    "    edge_start, edge_end = p1, p2\n",
    "elif edge_index == 1:\n",
    "    edge_start, edge_end = p2, p3\n",
    "elif edge_index == 2:\n",
    "    edge_start, edge_end = p3, p1\n",
    "\n",
    "# 计算边的中点\n",
    "mid_x = (edge_start[0] + edge_end[0]) / 2\n",
    "mid_y = (edge_start[1] + edge_end[1]) / 2\n",
    "\n",
    "# 生成随机偏移量，随机控制新顶点的位置\n",
    "offset_x = random.uniform(-0.5, 0.5)\n",
    "offset_y = random.uniform(-0.5, 0.5)\n",
    "\n",
    "new_x = mid_x + offset_x\n",
    "new_y = mid_y + offset_y\n",
    "\n",
    "# 返回新三角形\n",
    "return [edge_start, edge_end, (new_x, new_y)]\n",
    "\n",
    "def draw_triangles(base_triangle, num_iterations):\n",
    "\"\"\"\n",
    "绘制从随机三角形开始生成的一系列三角形。\n",
    "Parameters:\n",
    "    base_triangle (list of tuple): 初始随机三角形顶点 [(x1, y1), (x2, y2), (x3, y3)]\n",
    "    num_iterations (int): 生成的三角形数量\n",
    "\"\"\"\n",
    "triangles = [base_triangle]\n",
    "\n",
    "for _ in range(num_iterations):\n",
    "    # 随机选择一个已有的三角形\n",
    "    current_triangle = random.choice(triangles)\n",
    "\n",
    "    # 随机选择一个边 (0, 1, 2)\n",
    "    edge_index = random.randint(0, 2)\n",
    "\n",
    "    # 生成一个新的随机三角形\n",
    "    new_triangle = generate_triangle(current_triangle, edge_index)\n",
    "\n",
    "    # 添加到列表中\n",
    "    triangles.append(new_triangle)\n",
    "\n",
    "# 绘制所有三角形\n",
    "plt.figure(figsize=(8, 8))\n",
    "for triangle in triangles:\n",
    "    x_coords = [p[0] for p in triangle] + [triangle[0][0]]  # 闭合三角形\n",
    "    y_coords = [p[1] for p in triangle] + [triangle[0][1]]\n",
    "    plt.plot(x_coords, y_coords, 'b-')\n",
    "\n",
    "plt.axis('equal')\n",
    "plt.title('Generated Random Triangles')\n",
    "plt.show()\n",
    "\n",
    "初始随机三角形顶点\n",
    "\n",
    "initial_triangle = [(random.uniform(0, 1), random.uniform(0, 1)),\n",
    "(random.uniform(0, 1), random.uniform(0, 1)),\n",
    "(random.uniform(0, 1), random.uniform(0, 1))]\n",
    "生成并绘制图形\n",
    "\n",
    "draw_triangles(initial_triangle, num_iterations=10)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.20"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
